如何从文件创建多个数据框?

Posted

技术标签:

【中文标题】如何从文件创建多个数据框?【英文标题】:How to create a multiple dataframes from a file? 【发布时间】:2021-12-28 13:28:08 【问题描述】:

我有多个 txt 文件,如下所示:

[Level1]
Location = "London"
Type= "GTHY66"
Date = "16-11-2021"
Energy level = "Critical zero"
[Level2]
0.000   26.788
0.027   26.807
0.053   26.860

因此,我想从我读取/处理的每​​个文件中创建两个数据框(最终我将推送到数据库)。

level1中的dataframe需要为df_level1:

Location   Type      Date         Energy
London     GTHY66    16-11-2021   Critical zero

level1下的dataframe需要为df_level2:

Speed   Energylevel
0.000   26.788
0.027   26.807
0.053   26.860

这是我尝试过的,但我卡住了:

energy_root= r'c:\data\Desktop\Studio\Energyfiles'

#create list of file paths
def read_txt_file(path):
    list_file_path = []
    for root, dirs, files in os.walk(path):
        for file in files:
            if file.endswith('.txt'):
                file_name = os.path.basename(file)
                file_path = os.path.join(root, file_name)
                list_file_path.append(file_path)
    
    return list_file_path     

def create_df():
    for file in read_txt_file(energy_root):
        file_name = os.path.basename(file)
        file_path = os.path.join(energy_root, file_name)
        datetime = re.findall(r'_(\d8_\d6)\.', file_name)[0]

        with open(file_path, 'r+') as output:
            reader = output.readlines()
            for row in reader:
                d = row.split('=')
                if len(d) > 1:
                   df_level1 = pd.DataFrame([d[1]], columns=[d[0]])

                   print(df_level1 )
              "then create df_level2 ....."

create_df()       

【问题讨论】:

【参考方案1】:

您可以将pd.read_csv 与正确的分隔符一起使用,但您必须做两件事:

    之前:将文件的部分拆分为 Level1 和 Level2 之后:转置并设置Level1的列

这是代码,直接在您的 with open [...] 行内

reader = output.read() # simply the entire file text, not split into lines
parts = reader.split('[Level2]\n')
lvl1_lines = parts[0].split('[Level1]\n')[1].replace('"','')
lvl2_lines = "Speed   Energylevel\n" + parts[1]

from io import StringIO # to read strings as files for read_csv
df_level1 = pd.read_csv(StringIO(lvl1_lines), sep='\s*=\s*', engine='python').transpose().reset_index()
df_level1.columns = df_level1.iloc[0] # set the correct column names
df_level1 = df_level1[1:] # remove the column row
df_level2 = pd.read_csv(StringIO(lvl2_lines), sep='\\s+')

【讨论】:

Adam.Er8 Speed + EnergyLEvel 显示为 1 列,而它们需要是单独的列.... @Al-Andalus 好的,我将分隔符替换为 \\s+(一个或多个空格),而不是我最初认为的制表符。现在可以了吗? 顺便说一句,我错过了df_level1 中的一列。当我做print(df_level1.columns) 时,我得到:Index(['Type', 'Date ', 'Energy level '], dtype='object', name='Location ')。问题是:列位置在哪里,为什么不被视为列? @Al-Andalus 哎呀,转置后我忘了reset_index,现在应该没问题了【参考方案2】:

试试这个:

def read_txt_file(path):
    n = 0
    pattern = re.compile(r'(.+)\s*=\s*\"(.+)\"')
    level1 = 
    with open(path) as fp:
        for line in fp:
            line = line.strip()
            n += 1
            if line == '[Level2]':
                break
            
            m = pattern.match(line)
            if m is not None:
                key = m.group(1)
                value = m.group(2)
                level1[key] = value

    level1 = pd.DataFrame(level1, index=[0])
    level2 = pd.read_csv(path, sep='\s+', skiprows=n, header=None, names=['Speed', 'EnergyLevel'])
    return level1, level2

用法:

level1, level2 = read_txt_file('data.txt')

【讨论】:

我试过你的,但这似乎只有在 level1 只有 4 条记录和 level2 3 记录时才有效。有些文件有 20 条低于 level1 的记录和 40 或 50 条低于 level2 的记录。怎么解决? 它是为 1 级和 2 级中的任意行数编写的。我的测试按预期工作。你能发布麻烦的文件吗? 他们很安静。我如何与您分享它们? 您可以将其修剪到足以证明问题并编辑您的问题以包含文件

以上是关于如何从文件创建多个数据框?的主要内容,如果未能解决你的问题,请参考以下文章

如何在分区文件上创建数据框

如何使用 pyspark 从文本日志文件的特定部分创建数据框

如何请求一个 zip 文件,提取它,然后从 csv 文件创建熊猫数据框?

如何从数据框字典创建数据框?

如何从同时列出数据和模式的 JSON 文件创建 Spark-SQL 数据框

如何从xml文件创建R语言数据框dataframe