【发布时间】:2017-01-11 15:23:50
【问题描述】:
我编写了一个 python 脚本来输出 csv 文件的行和单元格。 我阅读的文件是从货运公司实用程序的地址簿中导出的。 看来,该文件以某种方式“损坏”。注册地址的同事做了一些错误的复制粘贴,并且经常插入许多引号而没有关闭它们。这弄乱了看起来大约的 csv 文件。当我用 less 或 cat 阅读它时是这样的:(我给行编号了)
1 ;name1;address1;"phone number1;;
2 ;name2;address2;phone number2;;
3 ;name3;address3;"phone number3;;
'line 1, cell 4' 直到 'line 3, cell 3;' 的内容最终在第 1 行单元格 4 中......当我用我的脚本输出它时,我看到:
1 ;name1;address1;phone number1;;;name2;address2;phone number2;;;name3;address3;
2 phone number3;;
问题是,我的文件有 30000 行长,而且这个错误重复了数百行。
解决方案很明显:将所有引号替换为空。
问题是:让python正确读取文件的最佳解决方案是什么? 或者:有没有办法在python中打开文件并使脚本忽略引号?我认为这会非常好。 我应该先找到/替换 python 吗? 我应该更正编码/重新编码文件吗? 我不知道文件是如何编码的:
$ file -i myfile.csv
myfile.csv: text/plain; charset=unknown-8bit
--
这是我的脚本代码,以防万一。请不要介意 unpythonicnesses。这只是我写的第二个脚本...
import sys, csv
file = sys.argv[1]
x = int(sys.argv[2]) - 1
if len (sys.argv) == 4:
y = int(sys.argv[3]) - 1
f = open(file, 'rb')
cr = csv.reader(f, delimiter=';')
lst = []
linecount = 0
for row in cr:
lst.append(row)
linecount += 1
if 'y' in locals():
line = lst[x][y]
print line
print '-'*len(line), '\n', 'line number', x + 1, '|', 'cell number', y + 1
print len(lst[x]), 'cells'
else:
print lst[x]
print '\n', file, linecount, 'lines'
我也许应该使用 csv.next() 而不是将所有内容都放在一个列表中。
【问题讨论】:
-
你为什么不把这个文件发回给这个烂摊子的负责人呢?礼貌而坚定地要求他们提供一个正确的 csv文件?
-
因为要花钱...
-
如果您必须为此付费,他们肯定会提供可用的产品。