Объединение нескольких CSV-файлов в один CSV-файл - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь объединить несколько файлов CSV в один, и попробовал несколько методов, но я изо всех сил.

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

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

Есть ли ошибка в моем коде? Есть ли какое-либо объяснение, почему мой CSV-файл ведет себя так?

csv_file_list = glob.glob(Dir + '/*.csv') #returns the file list
print (csv_file_list)
with open(Avg_Dir + '.csv','w') as f:
    wf = csv.writer(f, delimiter = ',')
    print (f)
    for files in csv_file_list:
        rd = csv.reader(open(files,'r'),delimiter = ',')
        for row in rd:
            print (row)
            wf.writerow(row)

Ответы [ 3 ]

0 голосов
/ 24 мая 2019

Ваш код работает для меня.

Кроме того, вы можете объединить файлы следующим образом:

csv_file_list = glob.glob(Dir + '/*.csv')
with open(Avg_Dir + '.csv','w') as wf:
    for file in csv_file_list:
        with open(file) as rf:
            for line in rf:
                if line.strip(): # if line is not empty
                    if not line.endswith("\n"):
                        line+="\n"
                    wf.write(line)

Или, если файлы не слишком велики, вы можете прочитать каждый файл сразу,Но в этом случае все пустые строки и заголовки будут скопированы:

csv_file_list = glob.glob(Dir + '/*.csv')
with open(Avg_Dir + '.csv','w') as wf:
    for file in csv_file_list:
        with open(file) as rf:
            wf.write(rf.read().strip()+"\n")
0 голосов
/ 24 мая 2019

Рассмотрим несколько настроек:

  1. Используйте диспетчер контекста, with, как для чтения, так и для записи.Это избавляет от необходимости close() файловых объектов, которые вы не делаете с read объектами.
  2. Для вопроса пропуска строк: используйте аргумент newline='' в open() или lineterminator="\n" аргумент вcsv.writer().См. SO ответы для прежних и последних .
  3. Используйте os.path.join() для правильного объединения путей к папкам и файлам.Этот метод не зависит от операционной системы, поэтому для учетных записей Windows или Unix используется тип прямой или обратной косой черты.

Скорректированный скрипт:

import os
import csv, glob

Dir = r"C:\Path\To\Source"
Avg_Dir = r"C:\Path\To\Destination\Output"

csv_file_list = glob.glob(os.path.join(Dir, '*.csv')) # returns the file list
print (csv_file_list)

with open(Avg_Dir + '.csv', 'w', newline='') as f:
    wf = csv.writer(f, lineterminator='\n')

    for files in csv_file_list:
        with open(files, 'r') as r: 
            next(r)                   # SKIP HEADERS
            rr = csv.reader(r)
            for row in rr:
                wf.writerow(row)
0 голосов
/ 24 мая 2019

Ваши файлы имеют одинаковую структуру? Они должны иметь следующую информацию, чтобы присоединиться, если не несоответствия. Если это не переменная, вы можете отобразить данные для создания окончательного файла.

В вашем коде это правильно, но для объединения файлов вы можете просто использовать команду "cat", если вы используете Unix-подобную операционную систему (Linux, MacOS и т. Д.), Но если у вас есть несколько файлов с разными структурами, так что да, Python будет идеальным. Но для этого случая ваш код потребует некоторых модификаций.

...