【问题标题】:Python csv new line character in field字段中的Python csv换行符
【发布时间】:2015-07-29 12:41:16
【问题描述】:

我在读取一个以刺分隔的 csv 文件时遇到问题,我认为该文件在其中一个字段中有一个换行符。它迫使该行超过两行,因此我无法读取该行最后一个字段中的值。我试过在new line mode 中打开,但不确定最好的方法是什么。

这就是我试图在python 中读取文件的方式:

csv.register_dialect('BB', delimiter='\xfe')
with open(file, 'rU') as file_in: 
    log=csv.reader(file_in, dialect='BB')
    for row in log:
        print row

这对大多数文件都有效,但我假设有一行在其中一个字段中有一个换行符 - 我不确定如何最好地诊断它。这是该行在记事本中的样子的屏幕截图,您可以看到,当它应该看起来像下面的两行时,它会强制该行在两行上。

使用csv.reader 阅读此行如下所示:

['06-13-2015-10:13:41', '0', '', '', '', '', '', '', '', '', '', ' ', '142', '', '5', '7.0', '2', '', 'cmhkl966', 'amex_674', '1', '0.00', '', '', "'"]

即在第一个撇号处被截断。

【问题讨论】:

  • 这不是我第一次看到 þ 作为 csv 分隔符。这有什么原因吗?是否有默认使用此分隔符的应用程序?

标签: python csv


【解决方案1】:

我稍微简化了你的问题(希望我抓住了问题的原因):

import io
import csv

file_in = io.StringIO('''
aþbþ'hello
world'
''')

log=csv.reader(file_in, delimiter='\xfe', quotechar="'")
for row in log:
    print(row)

输出:

['a', 'b', 'hello\nworld']

更新:

按照 cmets 的要求:这里是从文件中读取 .csv 的版本。 test.csv的内容是:

aþbþ'hello
world'þc
dþeþ'hello
other
things'þf
gþhþiþj

和python代码:

import csv
from pathlib import Path

HERE = Path(__file__).parent
DATA_PATH = HERE / '../data/test.csv'

with DATA_PATH.open('rU') as file_in:
    log=csv.reader(file_in, delimiter='\xfe', quotechar="'")
    for row in log:
        print(row)

哪个输出:

['a', 'b', 'hello\nworld', 'c']
['d', 'e', 'hello\nother\nthings', 'f']
['g', 'h', 'i', 'j']

【讨论】:

  • 从文件中读取而不是 StringIO 时,您还可以展示相同方法的演示吗?
  • 感谢您指出那里可能会出错。已更新。
  • 谢谢,这行得通。我认为解决方案可能涉及引用,但我不确定应该如何处理。
  • 如果你要写一个在字段中换行的csv,你会如何解决这个问题?
  • @romainjouin 没有尝试过,但是颠倒上面的过程(从列表开始并编写它们)应该可以工作。不是吗?
【解决方案2】:

您也可以检查下一行的第一个元素是否以时间戳开头,如果不是,则在打印前使用 list extend 函数将其添加到当前行的内容中。

免责声明:未经测试

import re

csv.register_dialect('BB', delimiter='\xfe')
with open(file, 'rU') as file_in: 
    log=csv.reader(file_in, dialect='BB')
    for i in range(0, len(log) - 1):
        if re.search('\d+-\d+-\d+-\d+:\d+:\d+', log[i+1][0]) is None:
            i.extend(log[i+1])
        print i

【讨论】:

  • 谢谢 - 我同意,我认为这也可以解决问题,但我接受了 hiro 的回答,因为这意味着增加的成本更少
猜你喜欢
  • 1970-01-01
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 2022-01-27
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
相关资源
最近更新 更多