不久前,我问过一个question如何处理带有特殊字符的.csv文件的导入。当时我对解决90%的案子很感兴趣,但现在我又回到了最后的10%。在
它的设置与以前基本相同:
代码如下:
import csv
import unicodecsv
#<Lots of other declarations and initialization>
def _csv_dict(self, file,index_field, ScrubMe, **kwargs):
#some irrelevant initialization stuff here.
if 'formatting' in kwargs:
formatting = kwargs['formatting']
else:
formatting = None #cp1252 is OS default
with open(file, encoding=formatting, errors='ignore') as f: #newline = '',
if formatting == None:
reader = csv.DictReader(f, dialect = 'excel')
else: #assume for now UTF-8 is the only other supported format
reader = unicodecsv.DictReader(f, dialect = csv.excel)
for line in reader:
<do some stuff - it's mostly building dictionaries, but I
generally edit the data to only keep the stuff I care about and do a little
data transformation to standard formats >
上面的结果是,如果我传递一个在原生codec中保存为.CSV的Excel文件,导入就可以了。但是,call including formatting='utf-8'关键字arg的unicodesv文件崩溃
错误消息表明我在这条线路的某个地方传递了错误类型的对象。这是我第一次尝试从UTF-8文件中读取一行时发生的
^{pr2}$从我所读到的,UTF-8实际上是制表符分隔的,而不是逗号分隔的,但我“认为”它的工作方式应该是相同的。在
我觉得我可能把一些简单的事情搞糟了,但我已经浪费了足够的时间去寻找合适的帮助。提前谢谢你的建议。在
我替换了我最初的答案,因为我有很多事情要做,我花了一段时间才解开它们。在
1)@lenz是对的。在python3中,不需要使用unicodesv.DictReader. 让我困惑的部分原因是实现上的差异。在
a)老年人unicodesv.DictReader来自Python 2:
b)对于Python 3csv.DictReader在
^{pr2}$总结不同之处
2)因为我的UTF-8文件是由Excel生成的,所以在文件的顶部有一个UTF_16_le样式的BOM表。唯一适用的代码是“utf_8_sig”。在
3)因为SQL Server正在下游读取我的输出文件,因此输出编解码器必须为“utf_16_le”,否则SQL Server无法识别它。在
4)另外,由于目标是SQL Server,我必须在文件顶部手动插入BOM。在
如果您在Excel中打开上述输出文件,它将不再位于列中,但SQL Server(实际上是SSIS)现在知道如何读取该文件。在
5)为了让我多惹点麻烦,有人在一些记录中有'\n'。在Excel作为源和目标的情况下,这不是问题,但对于SSIS来说是这样。我的解决方案:
相关问题 更多 >
编程相关推荐