我正在尝试将逗号分隔的csv文件转换为Pipe分隔符。我不使用逗号分隔的原因是因为我正在使用此文件并导入它的mysql数据库。一些字段本身有一个逗号,因此当我使用逗号分隔导入数据导入的字段正在更改时,所以我运行下面的python脚本将其从逗号更改为管道...所以当我导入数据,逗号本身仍然保留在需要的地方,我使用PIPE分隔符导入...但由于某种原因它失败了,有一点要记住它,这个确切的事情在上个月文件的时候工作正常400MB,而不是大约600MB
[root@host Dec]# python
Python 2.7.10 (default, Dec 8 2015, 18:25:23)
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import csv
>>>
>>> with open('/root/Dec/dec_no_quotes.csv', 'rb') as fin, \
... open('/root/Dec/dec_pipe.txt', 'wb') as fout:
... reader = csv.DictReader(fin)
... writer = csv.DictWriter(fout, reader.fieldnames, delimiter='|')
... writer.writeheader()
... writer.writerows(reader)
...
Killed
[root@host Dec]#
这是通过dmseg找到的内存不足消息......
[1710282.264394]内存不足:杀死进程22798(python)得分861或牺牲孩子 [1710282.269487]被杀的进程22798(python)total-vm:1954188kB,anon-rss:1818208kB,file-rss:176kB
答案 0 :(得分:2)
令人惊讶的是,DictWriter
将行转换为列表,然后调用低级编写器。来自2.x来源......
def writerows(self, rowdicts):
rows = []
for rowdict in rowdicts:
rows.append(self._dict_to_list(rowdict))
return self.writer.writerows(rows)
由于您没有使用列名,因此没有充分的理由使用DictWriter
,这比较慢并且如上所述,不是很可扩展。只需使用基础编写器。
>>> with open('/root/Dec/dec_no_quotes.csv', 'rb') as fin, \
... open('/root/Dec/dec_pipe.txt', 'wb') as fout:
... reader = csv.reader(fin)
... writer = csv.writer(fout, delimiter='|')
... writer.writerows(reader)
...