如何使用换行符@

时间:2015-04-27 18:22:08

标签: python csv

我需要在Python上读取csv,并且我拥有的文本文件具有以下结构:

"114555","CM13","0004","0","C/U"@"99172","CM13","0001","0","C/U"@"178672","CM13","0001","0","C/U"

delimeter:,

换行符:@

到目前为止我的代码:

import csv
data = []
with open('stock.csv') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', lineterminator='@')
    for row in reader:
        data.append({'MATERIAL':  row[0],'CENTRO': row[1], 'ALMACEN': row[2], 'STOCK_VALORIZADO' : row[3], 'STOCK_UMB':row[4]})


print(data)  #this print just one row

此代码只打印一行,因为它不能将@识别为换行符, 并用引号打印:

[{'MATERIAL': '114555', 'CENTRO': 'CM13', 'ALMACEN': '0004', 'STOCK_VALORIZADO': '0', 'STOCK_UMB': 'C/U@"99172"'}]

2 个答案:

答案 0 :(得分:8)

根据https://docs.python.org/2/library/csv.html“读者硬编码识别'\ r'或'\ n'作为行尾,并忽略行终止。此行为可能在将来发生变化。”因此,现在,提供参数lineterminator='@'将不起作用。

我认为最好的选择是将整个文件读入变量,并替换所有'@'字符,您可以按如下方式执行此操作:

with open("stock.csv", "r") as myfile:
    data = myfile.read().replace('@', '\n')

现在你需要调整你的算法,你可以将变量data传递给csv.reader(而不是文件stock.csv),根据python doc:

”iterable“参数可以是返回一行的任何对象 每次迭代的输入,例如文件对象或列表。 [...]

因此,您可以将data.splitlines()传递给csv.reader。

答案 1 :(得分:0)

我正在使用'\r\n'处理CRLF(csv.reader)行尾。我可以使用newline

中的open参数来使其工作
with open(local_file, 'r', newline='\r\n') as f:
    reader = csv.reader(f)