【发布时间】:2017-08-01 08:16:47
【问题描述】:
我是 python 和 stackoverflow 的新手。
- 我有一个包含 csv 文件的文件夹,我正在尝试从每个文件中读取字段名称并将它们写入新的 csv 文件。
- 感谢 stackoverflow,我能够制作和编辑我的代码,直到出现 unicode 错误。
- 我尽了最大努力解决这个错误并进行了研究。
- 我发现在 Mac 或 Linux 中创建的文件具有 utf8 unicode,而在 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
这是我尝试修复 unicode 错误的方法:
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)
然后这个错误就出来了:
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') 单独打开此文件时,它可以工作,但文件名旁边有 '\ufeff'。
我不确定,但我的猜测是该文件正在try: 中打开并且尚未关闭,因此 python 无法在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
【问题讨论】:
-
这个格式很差。
-
@Nabin 对不起.. 我尽力了,但我的代码和我的问题都很混乱。
-
对于
file not found错误,您确定您的代码以C:/dataset/作为其工作目录运行吗?您可以使用os.getcwd()来查找。我不确定编码。 -
@Stael 是的。由于它适用于 670 个文件,因此我的代码使用
C:/dataset/运行。 -
通常情况下,上下文管理器 (
with) 应该在进入except块之前关闭文件。但我无法理解您所说的它有效但文件名旁边有'\ufeff' 是什么意思。您能否详细说明一下,因为我怀疑这是您问题的关键('\ufeff'是 unicode 字节顺序标记)