Итеративное чтение нескольких cvs из разных каталогов в dataframe, а затем запись в новый csv - PullRequest
0 голосов
/ 20 ноября 2018

Я ударил стену.Пока что есть следующий код:

# define variables of each directory to be used
parent_data_dir = 'C:\\Users\\Admin\\Documents\\Python Scripts\\Data\\'
orig_data_dir = 'C:\\Users\\Admin\\Documents\\Python Scripts\\Data\\Original\\'
new_data_dir = 'C:\\Users\\Admin\\Documents\\Python Scripts\\Data\\New\\'

# Create list of original data files from orig_data_dir
orig_data = []
for root, dirs, files in os.walk(orig_data_dir):
    for file in files:
        if file.endswith('.csv'):
            orig_data.append(file)
# It populates the file names located in the orig_data_dir
# orig_data = ['Test1.csv', 'Test2.csv', 'Test3.csv'] 

# Create list of new data files from new_data_dir
new_data = []
for root, dirs, files in os.walk(new_data_dir):
    for file in files:
        if file.endswith('.csv'):
            new_data.append(file)
# It populates the file names located in the orig_data_dir
# orig_data = ['Test1_2.csv', 'Test2_2.csv', 'Test3_2.csv'] 

У меня есть три CSV-файла в каждом каталоге.CSV-файлы, заканчивающиеся на _2.csv, содержат новые данные, которые я хотел бы добавить к старым данным в новый CSV-файл для каждой соответствующей пары.Каждый CSV-файл имеет одинаковые строки.Я пытаюсь сделать следующее:

  1. Считать Test1.csv и Test1_2.csv в один фрейм данных, используя созданные мной списки (если лучше, я открыт для этого) (следующая итерация =Test2.csv и Test2_2.csv и т. Д.)
  2. Выполните некоторые действия с пандами
  3. Напишите новый файл с именем Test_Compiled_1.csv (следующая итерация = Test_Compiled_2.csv и т. Д.)
  4. Повторяйте до тех пор, пока каждая пара CSV из двух каталогов не будет объединена в новый файл CSV для каждой пары.

РЕДАКТИРОВАТЬ: у меня есть тысячи файлов CSV.С учетом сказанного мне нужно:

  1. прочитать в первой паре файлов на одном и том же кадре данных: 1-я итерация: Test1.csv, расположенный в orig_data_dir, и Test1_2.csv, расположенный в new_data_dir

  2. делать панды вещи

  3. записать заполненный кадр данных в новый файл в parent_data_dir

  4. Повторите для каждогопара файлов

2-я итерация будет: Test2.csv и Test2_2.csv

1000 итерация будет: Test1000.csv и Test1000_2.csv

Надеюсь, это поможет уточнить.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Лучший совет - указывать одинаковые имена для файлов в каждом каталоге и разрешать только полезные данные в этих каталогах.Вот решение для разных имен:

for filename in os.listdir(orig_data_dir):
    name,ext = os.path.splitext(filename)
    filename_2 = new_data_dir+name+'_2'+ext # construct new filename from old
    if os.path.isfile(filename_2):
        df_Orig=pd.read_csv(orig_data_dir+filename,index_col=0)
        df_New=pd.read_csv(filename_2,index_col=0)
        df_Orig.append(df_New).to_csv(orig_data_dir+filename)    

Здесь я накапливаю результат в Исходном файле.Необходим только один цикл.

0 голосов
/ 20 ноября 2018

Что-то вроде этого поможет вам:

from itertools import chain
import fnmatch

paths = ('/path/to/directory/one/', '/path/to/directory/two/', 'etc.', 'etc.')

file1 = []
file2 = []

for path, dirs, files in chain.from_iterable(os.walk(path) for path in paths):
    for file in files:
    if file in fnmatch.filter(files, '*1*.csv'):
        file1.append(file)
    if file in fnmatch.filter(files, '*2*.csv'):
        file2.append(file)

To create your dataframes you would do something like this;

df_file1 = pd.concat([pd.DataFrame(pd.read_csv(file1[0], sep=';')), pd.DataFrame(pd.read_csv(file1[1], sep=';'))], ignore_index=True)

df_file2 etc.

Примечание;'sep' в вашем csv может быть другим.

EDIT;Я изменил endswith на fnmatch.filter, теперь вы можете использовать любой понравившийся шаблон для сопоставления файлов, которые вам нужны в разных каталогах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...