首页 文章

读取文件夹中的多个镶木地板文件并使用python写入单个csv文件

提问于
浏览
0

我是python的新手,我有一个场景,其中有多个带有文件名的镶木地板文件 . 例如:par_file1,par_file2,par_file3等文件夹中最多100个文件 .

我需要按顺序从file1开始读取这些镶木地板文件并将其写入单个csv文件 . 在写入file1的内容之后,file2内容应该附加到没有 Headers 的相同csv . 请注意,所有文件都具有相同的列名称,并且只将数据拆分为多个文件 .

我学会了使用pyarrow将单个镶木地板转换为csv文件,代码如下

将pandas导入为pd

df = pd.read_parquet('par_file.parquet')

df.to_csv( 'csv_file.csv')

但我不能将其扩展为循环多个镶木地板文件并附加到单个csv . 大熊猫有没有办法做到这一点?或任何其他方式来做这将是非常有帮助的 . 谢谢 .

2 回答

  • 0

    如果要将文件复制到本地计算机并运行代码,则可以执行此类操作 . 下面的代码假定您在与镶木地板文件相同的目录中运行代码 . 它还假定文件的命名如上所述:"order. ex: par_file1,par_file2,par_file3 and so on upto 100 files in a folder."如果您需要搜索文件,则需要使用 glob 获取文件名,并明确提供要保存csv的路径: open(r'this\is\your\path\to\csv_file.csv', 'a') 希望这会有所帮助 .

    import pandas as pd
    
    # Create an empty csv file and write the first parquet file with headers
    with open('csv_file.csv','w') as csv_file:
        print('Reading par_file1.parquet')
        df = pd.read_parquet('par_file1.parquet')
        df.to_csv(csv_file, index=False)
        print('par_file1.parquet appended to csv_file.csv\n')
        csv_file.close()
    
    # create your file names and append to an empty list to look for in the current directory
    files = []
    for i in range(2,101):
        files.append(f'par_file{i}.parquet')
    
    # open files and append to csv_file.csv
    for f in files:
        print(f'Reading {f}')
        df = pd.read_parquet(f)
        with open('csv_file.csv','a') as file:
            df.to_csv(file, header=False, index=False)
            print(f'{f} appended to csv_file.csv\n')
    

    如果需要,可以删除打印语句 .

    使用 pandas 0.23.3python 3.6 中测试

  • 0

    我遇到了这个问题,看看pandas是否可以原生地读取分区的镶木地板数据集 . 我不得不说当前的答案是不必要的冗长(使其难以解析) . 我还想象,不断打开/关闭文件句柄然后根据大小扫描到它们的末尾并不是特别有效 .

    更好的选择是将所有镶木地板文件读入单个DataFrame,并将其写入一次:

    from pathlib import Path
    import pandas as pd
    
    data_dir = Path('dir/to/parquet/files')
    full_df = pd.concat(
        pd.read_parquet(parquet_file)
        for parquet_file in data_dir.glob('*.parquet')
    )
    full_df.to_csv('csv_file.csv')
    

    或者,如果您真的想要附加到文件:

    data_dir = Path('dir/to/parquet/files')
    for i, parquet_path in enumerate(data_dir.glob('*.parquet')):
        df = pd.read_parquet(parquet_path)
        write_header = i == 0 # write header only on the 0th file
        write_mode = 'w' if i == 0 else 'a' # 'write' mode for 0th file, 'append' otherwise
        df.to_csv('csv_file.csv', mode=write_mode, header=write_header)
    

相关问题