【问题标题】:Ignore a specific character when opening a file in python / csv在 python / csv 中打开文件时忽略特定字符
【发布时间】:2017-01-11 15:23:50
【问题描述】:

我编写了一个 python 脚本来输出 csv 文件的行和单元格。 我阅读的文件是从货运公司实用程序的地址簿中导出的。 看来,该文件以某种方式“损坏”。注册地址的同事做了一些错误的复制粘贴,并且经常插入许多引号而没有关闭它们。这弄乱了看起来大约的 csv 文件。当我用 lesscat 阅读它时是这样的:(我给行编号了)

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文件?
  • 因为要花钱...
  • 如果您必须为此付费,他们肯定会提供可用的产品。

标签: python csv encoding


【解决方案1】:

在使用csv.reader 时,它可以选择设置quotechar,在这里您可以将值设置为None。

cr = csv.reader(f, delimiter=';',quotechar=None)

【讨论】:

  • 太好了!非常感谢!
【解决方案2】:

不是一个真正的答案(我缺乏评论的代表,但我稍后会编辑这个以获得真正的答案。)

如果您有 linux 或 cygwin 可用,请尝试:sed 's/"//' filename

【讨论】:

    猜你喜欢
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2020-08-20
    • 1970-01-01
    相关资源
    最近更新 更多