2016-09-12 5 views
2

Я пытался записать выходной файл в виде файла CSV, но получая либо ошибку, либо ожидаемый результат. Я также использую Python 3.5.2 и 2.7.Как написать выходной файл в формате CSV в python?

Получение ошибки в Python 3.5:

wr.writerow(var) 
TypeError: a bytes-like object is required, not 'str' 

и

В Python 2.7, я получаю все результат столбца в одном столбце.

Ожидаемый результат:
Выходной файл того же формата, что и входной файл.

Код:

import csv 

f1 = open("input_1.csv", "r") 

resultFile = open("out.csv", "wb") 
wr = csv.writer(resultFile, quotechar=',') 

def sort_duplicates(f1): 
    for i in range(0, len(f1)): 
     f1.insert(f1.index(f1[i])+1, f1[i]) 
     f1.pop(i+1) 

for var in f1: 
     #print (var) 
     wr.writerow([var]) 

Если я использую resultFile = open("out.csv", "w"), я получаю одну строку дополнительно в выходном файле.

Если я использую код выше, получая одну строку и столбец дополнительно.

+0

Вы открываете файл в двоичном режиме. Просто удалите 'b' из' open ("out.csv", "wb") '. – Sevanteri

+0

@Sevanteri: Я попытался, но получение одной строки добавочно в файле результата. – krish

ответ

3

На Python 3, csvтребуется, что вы открываете файл в текстовом режиме, а не в двоичном режиме. Отбросьте b из вашего файлового режима. Вы должны действительно использовать newline='' тоже:

resultFile = open("out.csv", "w", newline='') 

еще лучше, использовать файловый объект в качестве менеджера контекста, чтобы убедиться, что он автоматически закрывается:

with open("input_1.csv", "r") as f1, \ 
    open("out.csv", "w", newline='') as resultFile: 
    wr = csv.writer(resultFile, dialect='excel') 
    for var in f1: 
     wr.writerow([var.rstrip('\n')]) 

Я также раздел строки из f1 (просто удалить новую строку) и поместить строку в список; csv.writer.writerow хочет последовательность с столбцами, а не одну строку.

Цитируя csv.writer() documentation:

Если csvfile является объектный файл, он должен быть открыт с newline='' [1]. [...] Перед тем, как быть написаны, все остальные нестроковые данные стробируются с помощью str().

[1] Если newline='' не указано, новые строки, встроенные внутри поля в кавычках не будут истолкованы правильно, и на платформах, которые используют \r\n linendings на писать дополнительный \r будет добавлен. Всегда должно быть безопасно указывать newline='', так как модуль csv выполняет свою собственную (universal) обработку новой строки.

+0

Обычно для окон требуется новая строка строки или у вас есть пустые строки, вставленные после каждой строки из-за добавленных символов CR –

+0

@ Jean-FrançoisFabre: и для любой другой платформы, где ' \ n' не является символом новой строки по умолчанию (поскольку символ '\ n' будет заменен на любом из них). –

+0

@Martijn Pieters: Я использовал новую строку, но каждое письмо - отдельная колонка – krish

0

открыть файл без режима б

режим б открыть файл как бинарный

вы можете открыть файл как ж

open_file = open("filename.csv", "w") 
0

Вы открываете входной файл в обычном режиме чтения, но выходной файл открывается в двоичном режиме, правильный путь

resultFile = open("out.csv", "w") 

Как показано выше, если вы замените «wb» на «w», это будет работать.

+0

Открыв без b, я получаю одну строку в файле результата. – krish

1

Другие ответили, что вы должны открыть выходной файл в текстовом режиме при использовании Python 3, т.е.

with open('out.csv', 'w', newline='') as resultFile: 
    ... 

Но вы также должны анализировать поступающие данные CSV. Поскольку ваш код считывает каждую строку входного CSV-файла в виде отдельной строки. Затем, не разбивая эту строку на ее составные поля, она передает строку в CSV-запись. В результате csv.writer будет обрабатывать строку как последовательность и выводить каждый символ , включая любой завершающий новый символ линии, в качестве отдельного поля. Например, если ваш входной файл CSV содержит:

 
1,2,3,4 

Выходной файл будет записан следующим образом:

 
1,",",2,",",3,",",4," 
" 

Вы должны изменить for петлю на это:

for row in csv.reader(f1): 
    # process the row 
    wr.writerow(row) 

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

for row in csv.reader(f1): 
    print(row) 
 
['1', '2', '3', '4'] 

И когда этот список передается csv.writer выход в файл будет:

 
1,2,3,4 

Собираем все, что вместе вы получаете этот код:

import csv 

with open('input_1.csv') as f1, open('out.csv', 'w', newline='') as resultFile: 
    wr = csv.writer(resultFile, dialect='excel') 
    for row in csv.reader(f1): 
     wr.writerow(row) 
+0

Привет всем, Теперь я получаю ожидаемый результат.Спасибо всем: – krish

+0

@krish, можете ли вы отметить это как принятый ответ, чтобы помочь другим? – FinancialRadDeveloper

Смежные вопросы