【问题标题】:How do you read a text file, then split that text file into multiple text files with python?如何读取文本文件,然后使用 python 将该文本文件拆分为多个文本文件?
【发布时间】:2014-07-14 01:46:38
【问题描述】:

我每天都会收到一个文本文件。我需要对文本文件做几件事。

  1. 我需要每 181 个字符插入一个换行符。

  2. 我需要逐行读取文本文件并将单独的行发送到新的文本文件。 这些文件每行可以包含不同的数据类型,这对我的系统来说是不可用的。例如,我明天可能会得到一个包含 250 行数据的文件,其中包含 6 种不同的数据类型。数据类型由该行的前四个字母决定。我需要阅读每一行,如果该行以 ABC1 开头,请将其发送到文本文件“ABC1.txt”。下一次迭代和所有以 ABC1 开头的行都需要附加到同一个“ABC1.txt”文件中。如果该行以“ABC2”开头,则将其发送到文本文件 ABC2。

最后我需要把 original_file.txt 拆分成 ABC1.txt, ABC2.txt, ABC3.txt, ABC4.txt。

我是编程新手,我正在摆弄它。目前我可以打开文件并阅读它,我可以将它打印到一个新文件中。我还没有弄清楚如何将这些行排序为我需要的行,然后将它们发送到新的文本文件,然后对其他文件类型重复此操作。我做了很多谷歌搜索并观看了很多视频,但似乎没有一个能做我想做的事情,它们都很普通。

我还想弄清楚如何将这个固定长度的文档转换为 csv,但这只是锦上添花。

【问题讨论】:

  • 也许你把你的代码放在这里,我们可以看到它有什么问题。

标签: python


【解决方案1】:

使用a 附加文件,每次使用 if/elif 检查以查看每一行的开头。

with open('original_file.txt', 'r') as infile,open("ABC1.txt","a") as ab1,open("ABC2.txt","a") as ab2,\
    open("ABC3.txt","a") as ab3,open("ABC4.txt","a") as ab4:
        for line in infile:
            if line.startswith("ABC1"):
                ab1.write(line)
            elif line.startswith("ABC2"):
                ab2.write(line)
            elif line.startswith("ABC3"):
                ab3.write(line)
            elif line.startswith("ABC4"):
                ab4.write(line) 

如果你想每 181 个字符插入一些东西,这应该接近你想要的:

def insert_break(s,n, br):
    while s:
        yield "{}{}".format(s[:n],br)
        s = s[n:]
with open('output.txt', 'r') as f,open('updated.txt', 'a') as f1:
    inserted= "".join((insert_break(f.read(),181,"\n")))
    f1.write(inserted)

with open('updated.txt', 'r') as infile,open("ABC1.txt","a") as ab1,open("ABC2.txt","a") as ab2,\
        open("ABC3.txt","a") as ab3,open("ABC4.txt","a") as ab4:
            for line in infile:
                print line.startswith("ABC1"),line
                if line.startswith("ABC1"):
                    ab1.write(line)
                elif line.startswith("ABC2"):
                    ab2.write(line)
                elif line.startswith("ABC3"):
                    ab3.write(line)
                elif line.startswith("ABC4"):
                    ab4.write(line)

如果您想查找字符串中是否有子字符串,请使用if "your_sub_s" in line:

【讨论】:

  • 太棒了。这几乎正​​是我正在寻找的。如果我想在该行中搜索一些文本,你能告诉我我会放什么吗?例如,有一些以 ABC 开头的行,但在后面的行中有 YYYNYNNN,我想用它来分割这些行而不是行的开头?我用什么来搜索 YYYNYNNN 而不是该行的开头?
  • if "YYYNYNNN" in line: 你还想每 180 个字符插入“\n”吗?
  • 如果我不清楚,我很抱歉。无论如何,我想为每一行每 180 个字符插入一个换行符。 YYYNYNNN 的东西是因为某些行以相同的 ABC1 开头,但仍需要根据行中间的 YYYNYNNN 块中的内容分类到不同的文件。不管怎样,你给了我可能接近我需要的一切。我只需要剖析代码,换掉真实的文件名,然后测试它以确保它有效。谢谢。
  • 你可以插入任何你喜欢的作为第三个参数insert_break,它将每181个字符插入一次。
  • 很抱歉继续提问,您的代码完美无缺。然而,似乎我不能使用“行开头”作为将我的文件行排序到其他文件中的一种方式。与其说该行是否以开头,不如说该行是否包含“ABC3*********P*”。星号是通配符,行总长度为 180 个字符。
【解决方案2】:

您需要学习的第一件事是在 Python 中处理文件。这个链接对于初学者来说是一个好的开始:

http://www.pythonforbeginners.com/files/reading-and-writing-files-in-python

csv 文件只是一个以逗号分隔值的文件,应该很容易弄清楚您何时掌握了一些基本的 Python 文件处理。在文本编辑器中打开一个 csv 文件,看看我的意思。

【讨论】:

    猜你喜欢
    • 2016-06-25
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多