Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果文件的下一行包含字符串,请将其附加到当前字符串的末尾_Python - Fatal编程技术网

Python 如果文件的下一行包含字符串,请将其附加到当前字符串的末尾

Python 如果文件的下一行包含字符串,请将其附加到当前字符串的末尾,python,Python,我有一个有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 contin

我有一个有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()
在文件中移动,但我一直无法让它工作。

我能够解决一些问题

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,

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

假设每一行以空格开头时,它都应该与前一行连接起来,这样应该可以:

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())

这里有一个便宜,合理有效的延续线为您连接

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

它只使用文件中最长的一组连续行的内存。

重新定义:如果下一个字符串以空格开头,则它是一个连续行。顺便说一句,CSV模块还没有处理这个问题吗?我不能使用CSV模块,因为它们没有用引号封装每个列,并且列值有时包含一个或多个逗号。我必须做很多格式化才能正确地分割它。编辑:是的,我已经尝试解决源数据问题。。。对于您的简短示例数据,这是一个徒劳的工作,不确定我们希望如何处理1300万行,虽然这与我的一样,但更好!这很好,但是您可以将读取的行存储在变量中,而不是将其位置存储在文件中并查找它。按顺序做事实际上要简单得多,更优雅(也更高效)。非常感谢。如果您希望将其作为一个函数(而不仅仅是一次性处理文件),您可以修改它以产生行,或者只使用9000的答案(我实际上认为这更优雅)。