pandascsvparquet

Read multiple parquet files in a folder and write to single csv file using python


I am new to python and I have a scenario where there are multiple parquet files with file names in order. ex: par_file1,par_file2,par_file3 and so on upto 100 files in a folder.

I need to read these parquet files starting from file1 in order and write it to a singe csv file. After writing contents of file1, file2 contents should be appended to same csv without header. Note that all files have same column names and only data is split into multiple files.

I learnt to convert single parquet to csv file using pyarrow with the following code:

import pandas as pd    
df = pd.read_parquet('par_file.parquet')    
df.to_csv('csv_file.csv')

But I could'nt extend this to loop for multiple parquet files and append to single csv. Is there a method in pandas to do this? or any other way to do this would be of great help. Thank you.


Solution

  • If you are going to copy the files over to your local machine and run your code you could do something like this. The code below assumes that you are running your code in the same directory as the parquet files. It also assumes the naming of files as your provided above: "order. ex: par_file1,par_file2,par_file3 and so on upto 100 files in a folder." If you need to search for your files then you will need to get the file names using glob and explicitly provide the path where you want to save the csv: open(r'this\is\your\path\to\csv_file.csv', 'a') Hope this helps.

    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')
    

    You can remove the print statements if you want.

    Tested in python 3.6 using pandas 0.23.3