【问题标题】:How to read multiple texts files, where we read all text files only of same group?如何读取多个文本文件,我们只读取同一组的所有文本文件?
【发布时间】:2020-05-07 20:54:39
【问题描述】:

我的目录中有几个这样的文本文件,

id-2020-01-21-22.txt
id-2020-01-21-23.txt
id-2020-01-22-00.txt
id-2020-01-22-01.txt
id-2020-01-22-02.txt
id-2020-01-23-00.txt
id-2020-01-24-00.txt

那么我怎样才能像我一起阅读id-2020-01-21-22.txtid-2020-01-21-23.txt一样阅读它们,将它们制成数据框,将它们写入组合文本文件,然后id-2020-01-22-00.txtid-2020-01-22-01.txtid-2020-01-22-02.txt一起,将它们写入数据框,依此类推,直到目录中的最后一个文件。

所有文本文件的内部结构如下:

100232323\n
903812398\n
284934289\n
{empty line placeholder}

没有标题,但每个文本文件的末尾都有一个空行。我是python新手,如果你能帮助我,不胜感激。

这是我已经走了多远:

import os

new_list = []
for root, dirs, files in os.walk('./textFilesFolder'):
    for file in files:
        if file.endswith('.txt'):
            with open(os.path.join(root, file), 'r') as f:
                text = f.read()
                new_list.append(text)


print(new_list)

【问题讨论】:

    标签: python python-3.x text-files


    【解决方案1】:

    您需要将每小时文件串联在一起的每日摘要。 好的,很好。

    创建一个 Y-m-d 日期regex

    import re
    
    date_re = re.compile(r'^id-(\d{4}-\d{2}-\d{2})-\d{2}\.txt$')
    prev_date = None
    

    现在在您的循环中,您可以将现有的if 替换为:

            m = date_re.search(file)
            if m:
                date = m.group(1)
                print(f'Working on day {date} ...')
                ...
                prev_date = date
    

    解析出日期后,您现在可以注意到它何时发生变化, 也许通过比较是否prev_date == date, 并采取适当的措施,例如写入新文件。

    或者考虑使用with open(f'output-{date}.txt', 'a') as fout: 让您附加到(可能已经存在的)文件。 这样文件系统就会为你记住事情, 而无需跟踪程序中的更多变量。

    顺便说一句,您对walk() 的使用非常好,对此表示赞赏。 但是对于这个目录的文件,结构就足够简单了 你可以使用glob:

    new_list = []
    for file in glob.glob('id-*.txt'):
        ...
    

    编辑

    假设我们从一个清晰的石板开始,没有输出文件:

    $ rm output-*.txt
    

    然后我们可以在一个循环中追加,类似于$ cat hour01 hour02 > day31。 或者,同样的事情,类似于$ rm day31; cat hour01 >> day31; cat hour02 >> day31

            m = date_re.search(file)
            if m:
                date = m.group(1)
                print(f'Working on day {date} ...')
                with open(file) as fin:
                    with open(f'output-{date}.txt', 'a') as fout:
                        fout.write(fin.read())
    

    就是这样,你完成了!我们阅读每小时的文本,并且 将其写入每日文件的末尾。

    我在上面提到了rm,因为如果您正在调试并且运行 这两次或 N 次,你会得到一个 N 倍大的输出文件 超出您的预期。

    【讨论】:

    • 谢谢先生。我没有正确地跟着你。对不起这个问题。我已经有文件了。我只需要在一起阅读所有 2020-01-21 文本文件的地方阅读它们,然后制作一个 2020-01-21 文本文件,将所有已读取的 2020-01-21 块组合在一起。你的代码应该进入我的循环吗??
    • 没关系,我现在明白你的意思了。明白了!!谢谢老板:)
    【解决方案2】:

    您也可以尝试这样做以提高可读性。

    from collections import defaultdict
    import os
    import pandas as pd
    
    data = defaultdict(list)
    for i in (os.listdir('files/')): # here files is a folder in current directory.
        print(i)                     # which has your text files.
        column = i.split('-')[3]
        with open('files/'+i, 'r') as f:
            file_data = f.read().replace('\n', ' ').split(' ')
            data[column].extend(file_data[:-1])
    df = pd.DataFrame(data)
    print('---')
    print(df)
    

    输出:

    id-2020-01-22-01.txt
    id-2020-01-22-00.txt
    id-2020-01-21-23.txt
    id-2020-01-21-22.txt
    ---
              22          21
    0    1006523  1002323212
    1   90381122  9038123912
    2   28493423   284934212
    3  100232323   100232323
    4  903812332   903812392
    5  284934212   284934289
    

    【讨论】:

    • 谢谢 shivank,我会选择这个作为答案。然而,J_H 首先回答了它。但是感谢您的帮助,一百万!
    • @WannabeSmith 完全没有问题 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    相关资源
    最近更新 更多