52934


python 3.7.2で勉強中です。

openの違いがわかりません。

以下のソースだとファイルダブルクリックもしくはDosプロンプトから「ファイル名」(pyなし)でエラーなく実行できます。

[code]

    # coding:utf-8
    
    import os, csv, time,io
    
    listFile = 'filelist.csv'
    dateFormat = '%Y/%m/%d %H:%M:%S'
    
    csvFile = open(listFile, 'wb')
    csvWriter = csv.writer(csvFile)
    path = "."
    
    for filename in os.listdir(path):
    
        if os.path.isfile(filename) \
           and os.path.basename(__file__) != filename \
           and listFile != filename:
            row = []
            # ファイル名
            row.append(filename)
            # ファイル作成日時 -> コメントアウト
            #row.append(time.strftime(dateFormat, \
            #           time.localtime(os.path.getctime(filename))))
            # ファイル更新日時
            row.append(time.strftime(dateFormat, \
                       time.localtime(os.path.getmtime(filename))))
            # ファイル容量 -> 新規追加
            row.append(os.path.getsize(filename))
    
            csvWriter.writerow(row)
    csvFile.close()
    
[/code]

ただし、Dosプロンプトから「py ファイル名」でエラーとなります  
[![py
ファイル名で実行した結果](https://i.stack.imgur.com/NtUxL.png)](https://i.stack.imgur.com/NtUxL.png)

そこで「open」を以下のように修正したところ、Dosプロンプトから「py ファイル名」でエラーなく実行できますが、

[code]

    csvFile = io.open(listFile, 'w', newline='')
    
[/code]

Dosプロンプトから「ファイル名」でエラーとなります  
[![「ファイル名」でエラーとなる](https://i.stack.imgur.com/sgSuC.png)](https://i.stack.imgur.com/sgSuC.png)

なぜこのような事象が発生するのか教えてください。


CC BY-SA 4.0
2019-02-22T02:59:50.813
52931
2019-02-22T06:05:19.583
2019-02-22T03:20:54.947
3060
28370
question
python python3 windows
pythonでio.openとopenの違いについて


本現象は「.py」ファイルがpython2と関連付けされているため発生します。  
Windowsでは、ファイルを直接起動すると関連付けされたアプリケーションで実行します。

今回の場合は、python2と紐付けられていると思われます。  
実際にpython2で実行してみると同じ現象が発生しますので試してみると良いと思います。

つまり、コマンドプロンプト上で実行したpythonはpython3であり、  
直接ダブルクリックやコマンドプロンプト上でファイルを直接実行した場合は、  
どこかにインストールされているpython2で起動されているため、挙動が異なったということになります。

ちなみに、Googleで検索した所Windows10の場合、以下で設定の確認や変更ができるようです。  
<https://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=018054>

* * *

試した結果も記載しておきます。  
（コードは質問の内容と同じです。）

[code]

    yamap55:/mnt/c/work/20190222/j$ python2 hoge.py
    yamap55:/mnt/c/work/20190222/j$ python3 hoge.py
    Traceback (most recent call last):
      File "hoge.py", line 28, in <module>
        csvWriter.writerow(row)
    TypeError: a bytes-like object is required, not 'str'
    
[/code]

コード変更

[code]

    yamap55:/mnt/c/work/20190222/j$ python3 hoge.py
    yamap55:/mnt/c/work/20190222/j$ python2 hoge.py
    Traceback (most recent call last):
      File "hoge.py", line 28, in <module>
        csvWriter.writerow(row)
    TypeError: write() argument 1 must be unicode, not str
    
[/code]


CC BY-SA 4.0
2019-02-22T05:21:49.683
52934
2019-02-22T06:05:19.583
2019-02-22T06:05:19.583
13022
13022
52931
answer