在python / csv中打开文件时忽略特定字符

时间:2017-01-11 15:23:50

标签: python csv encoding

我编写了一个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()而不是将所有内容放在列表中。

2 个答案:

答案 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);