【问题标题】:How to read csv on python with newline separator @如何使用换行符@在python上读取csv
【发布时间】:2015-04-27 18:22:08
【问题描述】:

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

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

分隔符:,

换行符:@

到目前为止我的代码:

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"'}]

【问题讨论】:

  • quoting=csv.QUOTE_NONE "指示阅读器不对引号字符进行特殊处理。"如果您想要不带引号,请不要使用csv.QUOTE_NONE
  • 我刚试过,但结果还是一样。引号可能有问题吗?
  • lineterminator 不起作用。文档说“阅读器被硬编码为将 '\r' 或 '\n' 识别为行尾,并忽略换行符。这种行为将来可能会改变。”这意味着您需要在 csv.reader 获取数据之前修复您的数据。
  • 这是 Python 2 还是 3?
  • 出于好奇,到底谁在写 CSV 时以 '@' 作为 lineterminator?

标签: python csv


【解决方案1】:

根据https://docs.python.org/2/library/csv.html“阅读器被硬编码以将 '\r' 或 '\n' 识别为行尾,并忽略换行符。这种行为将来可能会改变。” 因此,现在,提供参数lineterminator='@' 将不起作用。

我认为最好的选择是将整个文件读入一个变量,并替换所有'@'字符,你可以这样做:

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

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

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

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

【讨论】:

  • 希望所有字段都不包含'@',否则问题会变得更加棘手。
  • 我同意,但是我认为我们可以假设这里不是这种情况。
  • 可能需要data.splitlines(keepends=True)。在正常的文件迭代中,换行符被保留。 csv.reader 可以指望这一点。 (我懒得去测试是不是这样。)
  • 我不确定,在 OP 提供的示例中,看起来“@”字符是实际的换行符。我知道这听起来很奇怪,但是如果没有更多关于 OP 的信息,我们无法做出任何其他假设。
  • 我的意思是,当您遍历文件时,换行符是每一行的一部分。当您执行 data.splitlines() 时,您会得到没有行尾的行。所以可能需要保留换行符。否则您的答案可能会缩短为data = myfile.read().split('@')。我认为data = myfile.read().replace('@', '\n').splitlines(keepends=True) 可能更正确。
【解决方案2】:

我在使用 csv.reader 处理 CRLF ('\r\n') 行尾时遇到了困难。我能够使用open 中的newline 参数使其工作

with open(local_file, 'r', newline='\r\n') as f:
    reader = csv.reader(f)

【讨论】:

    猜你喜欢
    • 2017-03-21
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2018-07-25
    • 2013-02-06
    • 2010-12-08
    相关资源
    最近更新 更多