以块的形式读取,处理和写入文件

时间:2017-10-25 12:50:26

标签: python-3.6

我有两个程序完全符合我的要求。我试图将它们组合成一个程序,这是我需要一些帮助的地方。

程序#1读取整个文件,readlines(),处理它,然后将数据写入新文件。效果很好。

代码:

datafile = "d:\\python\\workbook\\countries-raw.txt"

with open(datafile, "r") as file:
    content = file.readlines()

content = [i.strip('\n') for i in content if '\n' in i]
content = [i for i in content if i != ""]
content = [i for i in content if i != "Top of Page"]
content = [i for i in content if len(i) != 1]

print(content)

newfile = "d:\\python\\workbook\\countries-raw-2.txt"

with open(newfile, "w") as file2:
    for i in content:
        file2.write(i + '\n')

程序#2以块的形式读取文件,一次读取X行。然后它打印数据 一次X行。它也完全符合预期。

包含样本输出的代码:

textfile = "d:\\mark\\python\\test.txt"


def read_n(file, x):
    with open(file, mode='r') as fh:
        while True:
            data = ''.join(fh.readline() for _ in range(x))

            if not data:
                break

            yield data


for nlines in read_n(textfile, 5):
    print(nlines)

'''    
    abc
    123
    def
    456
    ghi

    789
    jkl
    abc
    123
    def

    456
    ghi
    789
    jkl
    abc

    123
    def
    456
    ghi
    789

    jkl
    abc
    123
    def
    456

    ghi
    789
    jkl
'''

我想要的是结合他们的功能。假设我必须处理一个包含2000多万行(或更多行)文本的文件。我可能无法做到 读入整个文件并创建一个巨大的列表,如程序#1。

然而,这似乎会不必要地缓慢:

一行阅读。 处理这条线。 写下这一行。 重复,直到处理完整个文件。

我在想我的第二个程序的逻辑在这里会很棒:

读入X行。 处理所有X行。 写行(可能不完全是X取决于我在做什么)。 重复,直到处理完整个文件。

这就是我所拥有的但是它不起作用:(注意在处理完最后理解之后,列表[内容]中的内容是正确的。)

textfile = "d:\\python\\workbook\\countries-raw.txt"
newfile = "d:\\python\\workbook\\temp-2.txt"

def read_n(file, x):
    with open(file, mode='r') as fh:
        while True:
            data = ''.join(fh.readline() for _ in range(x))
            content = data.split('\n')
            content = [i for i in content if i != ""]
            content = [i for i in content if i != "Top of Page"]
            content = [i for i in content if len(i) != 1]

            if not content:
                break

            yield content


for nlines in read_n(textfile, 50):
    with open(newfile, "w") as file2:
        for item in content:
            content.write(item + '\n')
    print(nlines)

至少我有一个范围问题,因为PyCharm说的内容'在下部打印部分未知。另外,如果可能的话,在写入文件时,我不希望在程序#2的输出中出现数据之间的空格。

1 个答案:

答案 0 :(得分:0)

我刚想通了:

date | timestamp | predicted_value 2017-10-25| 21758492893 | 0.4 2017-10-25| 21758492917 | 0.3 2017-10-25| 21758493210 | 0.4 2017-10-25| 21758493782 | 0.2 2017-10-25| 21758494903 | 0.1 2017-10-26| 21758492893 | 7.2 ....