【问题标题】:Reading text files from subfolders and folders and creating a dataframe in pandas for each file text as one observation从子文件夹和文件夹中读取文本文件,并在 pandas 中为每个文件文本创建一个数据框作为一项观察
【发布时间】:2019-03-18 11:37:41
【问题描述】:

我在文件夹和子文件夹中有以下文本文件架构。

我想阅读它们并创建一个 df。我正在使用此代码,但它对我来说效果不佳,因为文本不是我检查的内容,并且文件不等于我的计数。

l = [pd.read_csv(filename,header=None, encoding='iso-8859-1') for filename in glob.glob("2018_01_01/*.txt")]
main_df = pd.concat(l, axis=1)
main_df = main_df.T
for i in range(2):
    l = [pd.read_csv(filename, header=None, encoding='iso-8859-1',quoting=csv.QUOTE_NONE) for filename in glob.glob(str(foldernames[i+1])+ '/' + '*.txt')]
    df = pd.concat(l, axis=1)
    df = df.T
    main_df = pd.merge(main_df, df)

file

【问题讨论】:

  • 您的所有文件是否都具有相同的结构,即相同的列,所以您可以简单地连接它们吗?
  • 是的,都是文本文件,没有列,像简单的txt文件
  • 我刚刚添加了一个答案。
  • 我已经更新了我的答案。你介意检查一下吗?
  • 您介意提供一个 txt 文件的外观吗?

标签: python pandas


【解决方案1】:

假设这些目录包含所有信息结构相同的txt文件:

import os
import pandas as pd

df = pd.DataFrame(columns=['observation'])

path = '/path/to/directory/of/directories/'

for directory in os.listdir(path):
    if os.path.isdir(directory):
        for filename in os.listdir(directory):
            with open(os.path.join(directory, filename)) as f:
                observation = f.read()
                current_df = pd.DataFrame({'observation': [observation]})
                df = df.append(current_df, ignore_index=True)

所有文件都被迭代后,df 应该是包含不同 txt 文件中所有信息的 DataFrame

【讨论】:

  • 我必须更新这个 - ,header=None, encoding='iso-8859-1',quoting=csv.QUOTE_NONE
  • 但是,我仍然有非结构化数据框,它有 1800 列和 5 行,最后一列和行是 NaN,在文件夹中我刚刚使用了 4 个子文件夹,并不是为了节省时间,应该有现在有 200 个文件
  • ParserError:数据标记错误。 C 错误:从第 0 行开始的字符串中的 EOF - 如果我跳过引用为 csv 部分
  • @AymanAlawin,如果我们添加quoting=csv.QUOTE_NONE 参数会怎样
  • @AymanAlawin,希望它现在可以工作。我的更新[observation.
【解决方案2】:

您可以使用 for 循环来做到这一点。但在此之前,您需要为所有文件命名,例如“fol_0”中的“fil_0”、“fol_1”中的“fil_1”、“fol_2”中的“fil_2”等等。这将有助于使用 for 循环:

dataframes = []
import pandas as pd
for var in range(1000):
    name  = "fol_" + str(var) + "/fil_" + str(var) + ".txt"
    dataframes.append(pd.read_csv(name)) # if you need to use all the files at once
    #otherwise
    df = pd.read_csv(name) # you can use file one by one

它会自动为每个文件创建数据框。

【讨论】:

  • 对不起,我有数千个文件
  • 感谢您的宝贵时间,我正在寻找以上答案。
猜你喜欢
  • 2019-11-18
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多