2017-08-01 9 views
0

pythonとstackoverflowの新機能です。Pythonでcsvファイルを読み込もうとするとUnicodeのデコードエラーが発生する

  • 私はcsvファイルのフォルダを持っており、各ファイルからフィールド名を読み込み、新しいcsvファイルに書き込もうとしています。
  • stackoverflowのおかげで、私はユニコードエラーが出てくるまで自分のコードを作り編集することができました。
  • 私はこのエラーを解決しようと努力して研究しました。
  • MacまたはLinuxで作成されたファイルにはutf8ユニコードがあり、Windowsで作成されたファイルにはcp949があることがわかりました。
  • したがって、私はutf8でそれらを開く必要があります。

私のコードは、最初に、このように見えた:

import csv 
import glob 
lst=[] 
files=glob.glob('C:/dataset/*.csv') 
with open('test.csv','w',encoding='cp949',newline='') as testfile: 
    csv_writer=csv.writer(testfile) 
    for file in files: 
     with open(file,'r') as infile: 
      file=file[file.rfind('\\')+1:] 
      reader=csv.reader(infile) 
      headers=next(reader) 
      headers=[str for str in headers if str] 
      while len(headers) < 3 : 
       headers=next(reader) 
       headers=[str for str in headers if str] 
      lst=[file]+headers 
      csv_writer.writerow(lst) 

次に、このエラーが出てきた:ここ

Traceback (most recent call last): 
    File "C:\Python35\2.py", line 12, in <module> 
    headers=next(reader) 
UnicodeDecodeError: 'cp949' codec can't decode byte 0xec in position 6: illegal multibyte sequence 

が、私はユニコードエラーを修正しようとした方法である:

import csv 
import glob 
lst=[] 
files=glob.glob('C:/dataset/*.csv') 
with open('test.csv','w',encoding='cp949',newline='') as testfile: 
    csv_writer=csv.writer(testfile) 
    for file in files: 
     try: 
      with open(file,'r') as infile: 
       file=file[file.rfind('\\')+1:] 
       reader=csv.reader(infile) 
       headers=next(reader) 
       headers=[str for str in headers if str] 
       while len(headers) < 3 : 
        headers=next(reader) 
        headers=[str for str in headers if str] 
       lst=[file]+headers 
       csv_writer.writerow(lst) 
     except: 
      with open(file,'r',encoding='utf8') as infile: 
       file=file[file.rfind('\\')+1:] 
       reader=csv.reader(infile) 
       headers=next(reader) 
       headers=[str for str in headers if str] 
       while len(headers) < 3 : 
        headers=next(reader) 
        headers=[str for str in headers if str] 
       lst=[file]+headers 
       csv_writer.writerow(lst) 

このエラーcアウトAME:

Traceback (most recent call last): 
    File "C:\Python35\2.py", line 12, in <module> 
    headers=next(reader) 
UnicodeDecodeError: 'cp949' codec can't decode byte 0xec in position 6: illegal multibyte sequence 

を上記の例外の取り扱い時には、別の例外が発生しました:

Traceback (most recent call last): 
    File "C:\Python35\2.py", line 20, in <module> 
    with open(file,'r',encoding='utf8') as infile: 
FileNotFoundError: [Errno 2] No such file or directory: '2010_1_1.csv' 

ファイルを'2010_1_1.csv'間違いなく私のディレクトリに存在する('C:/dataset/*.csv')

私が個別にこのファイルを開こうとしますopen('C:/dataset/2010_1_1.csv','r',encoding='utf8')を使用すると動作しますが、filenameの隣に '\ ufeff'があります。

私はこのファイルがtry:で開かれていて、まだクローズされていないと考えています。したがって、このファイルはexceptで開けません。

このUnicodeの問題を解決するためにコードを編集するにはどうすればよいですか?


import glob 
from chardet.universaldetector import UniversalDetector 
files=glob.glob('C:/example/*.csv') 
for filename in files: 
print(filename.ljust(60)), 
detector.reset() 
for line in file(filename, 'rb'): 
    detector.feed(line) 
    if detector.done: break 
detector.close() 
print(detector.result) 

エラー:

Traceback (most recent call last): 
    File "<pyshell#20>", line 4, in <module> 
    for line in file(filename, 'rb'): 
TypeError: 'str' object is not callable 
+0

これはフォーマットが不適切です。 – Nabin

+0

@Nabin申し訳ありません。私はベストを尽くしましたが、私のコードと私の質問の両方が面倒です。 –

+0

の 'file not found'エラーが発生しました。コードが' C:/ dataset/'を作業ディレクトリとして使用していることを確認してください。 'os.getcwd()'を使って調べることができます。私はエンコーディングについてはわかりません。 – Stael

答えて

0

私はこのうち私を呼んでのPythonと非常に経験豊富ではないんですができませんが、開いたとき、あなたは、単にファイルのエンコーディングを無視しようとする可能性がそれ。私はJavaプログラマで、私の経験からは、新しいファイルを作成するときにエンコーディングを指定する必要があります。

+0

ありがとうございました。しかし、私が上で述べたように、私はそれを別々に行うと機能します。コードが停止するたびに手動でチェックすることなく、どのファイルがエラーを引き起こしているのかわかりません。 'try'と' except'を使ってこの作業を一度にやりたいときにはうまくいきません。 –

0

正しくデコードされない場合は、ファイルがcp949に書き込まれていないようです。あなたは正しいエンコーディングを見つけなければなりません。 chardetのようなモジュールが役に立ちます。

Windowsでは、ファイルを読み込むときに、書き込まれたエンコーディングでファイルを開きます。UTF-8の場合は、utf-8-sigを使用します。これは、バイトオーダーマーク(BOM)U+FEFF文字があればそれを自動的に処理して削除します。書くときは、すべての可能なUnicode文字を処理し、BOMを追加するので、メモ帳やExcelなどのWindowsツールでUTF-8エンコードされたファイルが認識されるため、utf-8-sigを使用するのが最善の方法です。それがなければ、ほとんどのWindowsツールは、ローカライズ版のWindowsごとに異なるANSIエンコーディングを想定しています。

+0

私は 'open'を使ってファイルのエンコーディングをチェックしようとしましたが、結果はすべてのファイルのエンコーディングが奇妙な' cp949'でした。手動でExcelを開いてエラーが発生したcsvファイルをチェックアウトしたとき、その形式は正常に動作したファイルとは異なりました。たとえば、(1,2)がNAMEの場合、列2のすべての行はNAMEである必要がありますが、一部の行では、1つのセル(column2)に複数の名前を入れるのではなく、各列に2から何かまで列の長さは互いに異なっていた。 –

+0

私は再びエンコードをチェックアウトするためにチャードを試します。 –

+0

'open'はエンコーディングを検出しません。これはシステムのデフォルトです。あなたは、開かれているファイルの正しいエンコーディングを知る必要があります。 –

関連する問題