#python #pandas #dataframe #csv
#python #pandas #фрейм данных #csv
Вопрос:
Я запускаю следующий код для отдельных файлов CSV:
import pandas as pd
header_names = ['column1', 'column2', 'column3', 'column4', 'column5', 'column6']
df = pd.read_csv('some.csv', delimiter= "|", skiprows=1, names=header_names)
df['column2'].replace(['bad', 'worse'],['good', 'better'],inplace =True)
df.to_csv('new.csv', index=False)
Как я могу запустить этот код для пакета файлов вместо изменения кода для каждого имени файла?
Редактировать: если все файлы CSV, которые я хочу изменить, находятся в одной папке, это упростит задачу?
Комментарии:
1. вы хотите добавить весь CSV в new.csv?
2. используйте glob, чтобы получить список файлов CSV, затем выполните итерацию по нему
3. Есть два простых способа. Вы можете получить список файлов, а затем выполнить цикл по ним. Вы также можете использовать
Dask
для одновременного чтения всех файлов, а затем выполнить манипуляцию один раз.4. @gtomer Мне нужно изменить существующие CSV-файлы, а затем сохранить измененный CSV-файл в качестве нового файла
Ответ №1:
Запуск этой логики для нескольких файлов:
import os
import pandas as pd
def my_function(source_file, target_suffix):
header_names = ['column1', 'column2', 'column3', 'column4', 'column5', 'column6']
df = pd.read_csv(source_file, delimiter= "|", skiprows=1, names=header_names)
df['column2'].replace(['bad', 'worse'],['good', 'better'],inplace =True)
# Generating output file name based on the input file name, and the provided suffix
target_file = source_file.replace('.csv', '') '_output_' str(target_suffix) '.csv'
df.to_csv(target_file, index=False)
# Define list of input_file
file_names = []
# Set the directory of your files
directory = os.path.join("c:\","path")
# Locate the input csv file
for root,dirs,files in os.walk(directory):
for file in files:
if file.endswith(".csv"):
file_names.append(file)
# Looping on the input file names and their indexes using enumerate
for i, source_file in enumerate(file_names):
# Call the function on the file name, and passing file index as the suffix
my_function(source_file, i)
Комментарии:
1. Могу ли я импортировать папку, чтобы мне не нужно было вводить имя каждого файла .csv, который я хочу изменить, а также имя вывода?
2. @canigan обновил код, теперь он находит входные CSV-файлы и выводит их с уникальными именами
Ответ №2:
Как ответили gtomer и Aviv Yaniv, я хотел бы расширить этот ответ, как вы собираетесь получить имя файлов, которые находятся в вашем целевом каталоге. Вы можете использовать следующий код, чтобы получить имена файлов csv в каталоге.
csv_files=[]
import os
directory=os.path.join("Path to the directory")
for root,dirs,files in os.walk(directory):
for file in files:
if file.endswith(".csv"):
print(file)
csv_files.append(pd.read_csv(file,error_bad_lines=False))
и вы можете запустить свою логику внутри цикла for, перебирающего каждый файл.
Ответ №3:
Вы можете переключаться между вашими файлами:
files = ['file1.csv','file2.csv','file3.csv']
agg_df = pd.DataFrame()
for file in files:
df = pd.read_csv(file, delimiter= "|", skiprows=1, names=header_names)
df['column2'].replace(['bad', 'worse'],['good', 'better'],inplace =True)
agg_df = agg_df.append(df)
agg_df.to_csv('new.csv', index=False)
Ответ №4:
import pandas as pd
import dask.dataframe as dd
header_names = ['column1', 'column2', 'column3', 'column4', 'column5', 'column6']
df = dd.read_csv("./directory/*.csv", delimiter= "|", skiprows=1, names=header_names)
df['column2'] = df['column2'].replace(['bad', 'worse'],['good', 'better'])
df.to_csv("./directory/export-*.csv")
Существует множество способов изменить имя экспорта. * в read_csv
будет считываться все файлы с окончанием .csv. * на to_csv
будет нумеровать все разные файлы, когда они будут экспортированы. Нет необходимости использовать циклы for с использованием этого метода.
Комментарии:
1. Я действительно хочу попробовать это, но у меня не установлен dask, и когда я пытаюсь его установить, я продолжаю получать ошибку разрешения на запись, поэтому мне придется попробовать решение, которое не связано с этим