2017-08-09 11 views
0

utf-8テキスト形式の.csvファイルを読み込み、パイプ区切り文字付きのcp1252(ansi)形式で書き込もうとしています。次のコードはPython 3.6で動作しますが、Python 2.6でも動作する必要があります。しかし、 'open'関数はPython 2.6でencodingキーワードを許可しません。csvをuts-8からcsv writer python 2.6のansiに変換できません。

import datetime 
import csv 

# Define what filenames to read 
filenames = ["FILE1","FILE2"] 
infilenames = [filename+".csv" for filename in filenames] 
outfilenames = [filename+"_out_.csv" for filename in filenames] 

# Read filenames in utf-8 and write them in cp1252 
for infilename,outfilename in zip(infilenames,outfilenames): 
    infile = open(infilename, "rt",encoding="utf8") 
    reader = csv.reader(infile,delimiter=',',quotechar='"',quoting=csv.QUOTE_MINIMAL) 

    outfile = open(outfilename, "wt",encoding="cp1252") 
    writer = csv.writer(outfile, delimiter='|', quotechar='"', quoting=csv.QUOTE_NONE,escapechar='\\') 
    for row in reader: 
     writer.writerow(row)  

infile.close() 
outfile.close() 

私はいくつかのソリューションを試してみました:

  • は、エンコーディングを定義するわけではありません。特定のユニコード文字でエラーが発生する
  • ioライブラリ(openではなくio.open)を使用します。 「型エラー:テキストストリーム内のテキストにstrを書き込むことができません」という結果になります。

誰かがPython 2.Xでこれに対して正しい解決法を知っていますか?

+0

Pythonの2の '' csv'は好きではありません。 unicode'文字列であるため、標準ライブラリには簡単な修正はありません。ただし、サードパーティのソリューションがあります。たとえば、[この質問](https://stackoverflow.com/questions/904041/reading-a-utf8-csv-file-with-python)への回答を確認してください。 – lenz

答えて

0

あり、ここでいくつかの冗長コードであるが、私は、これは次のようにして動作するようになったことがあります。

  • まず、私はそれ「CP1252」にするために.decodeと.encode目的球を使用encondingをしました。
    • は、その後、私はCP1252エンコードされたファイルからCSVファイルを読み込み、新しいCSV

にそれを書いた...

import datetime 
import csv 

# Define what filenames to read 
filenames = ["FILE1","FILE2"] 


infilenames = [filename+".csv" for filename in filenames] 
outfilenames = [filename+"_out_.csv" for filename in filenames] 
midfilenames = [filename+"_mid_.csv" for filename in filenames] 

# Iterate over each file 
for infilename,outfilename,midfilename in zip(infilenames,outfilenames,midfilenames): 

    # Open file and read utf-8 text, then encode in cp1252 
    infile = open(infilename, "r") 
    infilet = infile.read() 
    infilet = infilet.decode("utf-8") 
    infilet = infilet.encode("cp1252","ignore") 

    #write cp1252 encoded file 
    midfile = open(midfilename,"w") 
    midfile.write(infilet) 
    midfile.close() 

    # read csv with new cp1252 encoding 
    midfile = open(midfilename,"r") 
    reader = csv.reader(midfile,delimiter=',', quotechar='"',quoting=csv.QUOTE_MINIMAL) 

    # define output 
    outfile = open(outfilename, "w") 
    writer = csv.writer(outfile, delimiter='|', quotechar='"',quoting=csv.QUOTE_NONE,escapechar='\\') 

    #write output to new csv file 
    for row in reader: 
     writer.writerow(row) 

    print("written file",outfilename) 
    infile.close() 
    midfile.close() 
    outfile.close() 
関連する問題