【问题标题】:If the next line of a file contains a string, append it to the end of the current one如果文件的下一行包含一个字符串,则将其附加到当前行的末尾
【发布时间】:2017-03-18 12:46:35
【问题描述】:

我有一个包含 1300 万行的 CSV。数据没有引用封装,它包含换行符,这导致一行数据有换行符。数据每行没有多个断点,只有一个。

我将如何获取这样的数据?

Line of data
Line of data
 continuation of previous line of data
Line of data
Line of data
 continuation of previous line
Line of data

然后把它变成这样:

Line of data
Line of data continuation of previous line of data
Line of data
Line of data continuation of previous line
Line of data

我已经通过将行存储在一个变量中并处理下一个来测试这一点,寻找第一个字符不是“L”,然后附加它。我也尝试过使用f.tell()f.seek() 在文件中移动,但我无法让它工作。

【问题讨论】:

  • 重新表述:如果下一个字符串以空格开头,则为续行。顺便说一句,csv module 不是已经处理了吗?
  • 我不能使用 CSV 模块,因为它们没有为每一列封装引号,并且列值有时包含一个或多个逗号。我必须做很多格式化才能正确拆分它。编辑:是的,我已经尝试过解决源数据问题......这是徒劳的努力
  • this answer 适用于您的简短示例数据,但不确定我们希望如何处理 1300 万行

标签: python


【解决方案1】:

假设每次以空格开头的行都应该与前一行连接,这应该有效:

with open(data) as infile:
    previous_line = None
    for line in infile:
        if previous_line is None:
            previous_line = line
        if line.startswith(' '):
            line = previous_line.strip() + line
        previous_line = line
        print(line.strip())

【讨论】:

  • 更加优雅(和高效)。谢谢!
  • 如果你想把它作为一个函数(而不仅仅是一次性处理文件),你可以修改它以产生行,或者只使用来自 9000 的答案(我实际上认为更多仍然优雅)。
【解决方案2】:

这是一个便宜的,合理有效的延续线连接器。

def cont_lines(source):
    last_line = ''
    for line in source:
        if line.startswith(' '):
            last_line += line.lstrip()  # append a continuation
        else:
            if last_line:
                yield last_line
            last_line = line
    if last_line:  # The one remaining as the source has ended.
        yield last_line

这样使用:

with open("tile.csv") as f:
  for line in cont_lines(f):
     # do something with line

它只使用与文件中最长的连续行集一样多的内存。

【讨论】:

  • 这和我的一样,但更好!
【解决方案3】:

我能够解决一些问题。

infile = "test.txt"
def peek_line(f):
    pos = f.tell()
    line = f.readline()
    f.seek(pos)
    return line

f = open(infile, 'r')
while True:
    line = f.readline()
    if not line:
        break
    peek = peek_line(f)
    if not peek.startswith('T'):
        line = (line.strip() + f.readline())
    print line,

我愿意接受有关此方法的反馈。

【讨论】:

  • 这很好,但是您可以只将读取的行存储在变量中,而不是将其位置存储在文件中并寻找它。按顺序做事真的要简单得多。
猜你喜欢
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 2021-12-16
  • 2015-07-14
  • 2015-09-21
  • 1970-01-01
相关资源
最近更新 更多