我编写了一个python脚本来输出csv文件的行和单元格。 我读过的文件已从货运公司实用程序的地址簿中导出。 看来,这个文件在某种程度上“已损坏”。注册地址的同事做了一些错误的复制粘贴,并且经常插入许多引号而不关闭它们。这搞砸了看起来很近的csv文件。当我用 less 或 cat 读取它时(我编号为行)
1 ;name1;address1;"phone number1;;
2 ;name2;address2;phone number2;;
3 ;name3;address3;"phone number3;;
“第1行,第4行”的内容,直到“第3行,第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
-
以下是我的脚本代码,以防它有用。请不要介意unpythonicness。这只是我写过的第二个剧本......
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()而不是将所有内容放在列表中。
答案 0 :(得分:0)
不是真正的答案(我没有评论的代表,但我稍后会编辑这个以获得真实答案。)
如果您有linux或cygwin可用,请尝试:sed 's/"//' filename
答案 1 :(得分:0)
使用csv.reader时,可以选择设置quotechar,此处可以将值设置为None。
group by 1, 2, date_trunc('month',oh.create_date)
order by 1, 2, date_trunc('month',oh.create_date);