【问题标题】:Creating one csv files from multiple files in the same folder [duplicate]从同一文件夹中的多个文件创建一个csv文件[重复]
【发布时间】:2021-11-24 12:02:22
【问题描述】:

我在同一个文件夹中有数千个 csv 文件名称,如下所示 file_x_x.csv 其中 x 是 1 到 10000 之间的数字。 每个文件包含一个标题和一行数据:

file_1_1.csv

Name Surname Age Address
Michael O'Donnel 22 George St.

file_2_2.csv

Name Surname Age Address
Mary Jane 34 Camden St.

等等。

我正在寻找创建一个包含所有这些行的文件:

final_file.csv

Name Surname Age Address
Michael O'Donnel 22 George St.
Mary Jane 34 Camden St.

...

我的做法:

import pandas as pd
import glob

path = # add path
all_files = glob.glob(path + ".csv") # look for all the csv files in that folder. Probably this is not the right code for looking at them

file_list = []

for filename in all_files:
    df = pd.read_csv(filename)
    file_list(df)

我不知道最后如何创建一个唯一的文件。你能看看上面的代码并告诉我如何获得所需的输出以及我是否遗漏了什么?

【问题讨论】:

  • 您所描述的实际上并不是一个 csv 文件。 CSV 表示“逗号分隔值”,它们应该用 , 而不是空格分隔,因此 pandas 不会正确读取这些值。
  • @ThomasQ - CSV 有几种约定 - 逗号、制表符、竖线、空格、分号。 pandas 允许您设置分隔符。如何处理应该转义的单元格内部空间可能存在问题,但通常它可以工作。
  • @tdelaney 我知道有很多约定,但即使使用sep=" " ,pandas 也不会正确加载示例中的 csv,因为地址是George St.Camden St.跨度>
  • @ThomasQ - 对。 CSV 是几种类似格式的术语,这些示例不符合其中任何一种格式。最好不要尝试解析它们,如果可以就复制。

标签: python pandas


【解决方案1】:

你不需要在这里做任何复杂的事情。您知道标题行,并且您知道您希望最终成为 除了 标题之外的所有内容。只需打开文件,跳过第一行,然后写入。这比内存中一堆数据帧的内存消耗要高效得多。

import glob

with open("final_file.csv", "w") as outfile:
    for count, filename in enumerate(glob.glob(path + ".csv")):
        with open(filename) as infile:
            header = next(infile)
            if count == 0:
                outfile.write(header)
            line = next(infile)
            if not line.startswith("\n"):
                line = line + "\n"
            outfile.write(line)

【讨论】:

  • 有没有办法不手动写入/选择标题,而只是从第一个文件中保留一个?将来可能会有更多的列。谢谢
  • @LdM - 已更新。
【解决方案2】:

我建议使用pd.concat 将 DataFrame 组合成一个大的 DataFrame,然后您可以根据需要将其保存到不同的文件中。

在连接 DataFrame 之前,您可能必须修改对 pd.read_csv 的调用,以确保正确处理数据。如果您问题中的示例数据与 CSV 文件的内容逐字匹配,则代码 sn-p 将如下所示:

import pandas as pd
import glob

path = "/my_path" # set this to the folder containing CSVs
names = glob.glob(path + "*.csv") # get names of all CSV files under path

# If your CSV files use commas to split fields, then the sep 
# argument can be ommitted or set to ","
file_list = pd.concat([pd.read_csv(filename, sep=" ") for filename in names])

#save the DataFrame to a file
file_list.to_csv("combined_data.csv")

请注意,组合索引中的每一行仍将根据其源文件中的行号进行索引,从而创建重复的行索引。要更改它,请致电pd.DataFrame.reset_index()

file_list = file_list.reset_index(drop=True)

【讨论】:

  • 您需要在read_csv 上使用sep=" "
  • @tdelaney 我最初假设 OP 示例中的示例数据实际上只是一个打印的 DataFrame,而不是来自实际 CSV 的行。我将在回复中进一步澄清这一点。感谢您指出这一点。
  • 我收到一条消息 ValueError:names = glob.glob(path + ".csv") # get names of all CSV files under path 中没有要连接的对象。我想这里缺少一些东西(例如选择所有 csv 文件的东西,不管名称)
  • @LdM 道歉,应该是 path + “*.csv” 而不是 path + “.csv” 我会编辑我的回复
猜你喜欢
  • 2021-05-27
  • 1970-01-01
  • 2018-05-09
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 2018-08-09
相关资源
最近更新 更多