Створіть .csv файл зі значеннями зі списку Python


182

Я намагаюся створити .csv файл зі значеннями зі списку Python. Коли я друкую значення у списку, вони всі є unicode (?), Тобто вони виглядають приблизно так

[u'value 1', u'value 2', ...]

Якщо я повторюю значення зі списку, тобто for v in mylist: print vвони виглядають як звичайний текст.

І я можу поставити ,між собоюprint ','.join(mylist)

І я можу вивести файл, тобто

myfile = open(...)
print >>myfile, ','.join(mylist)

Але я хочу вивести CSV і мати роздільники навколо значень у списку, наприклад

"value 1", "value 2", ... 

Я не можу знайти простий спосіб включити роздільники до форматування, наприклад, я спробував через joinоператор. Як я можу це зробити?


Дякую всім, я поєднав ідеї з кількох відповідей, щоб вирішити своє питання :) Тепер я використовую модуль csv, щоб записати [...] дані прямо у файл імпорту csv data = [...] myfile = open ( ..., 'wb') out = csv.writer (відкритий ("myfile.csv", "w"), роздільник = ',', цитування = csv.QUOTE_ALL) out.writerow (дані) працює добре, я будую мої дані [], захопивши деякі дані з електронної таблиці за допомогою xlrd, а модуль csv записує їх у файл із правильними роздільниками - все добре :)
введіть

Більш свіжим підходом може стати використання панд
Річард

Користувачі Python 3.4, це найкраще працювало для мене: stackoverflow.com/questions/25022677/…
Лі

Відповіді:


254
import csv

with open(..., 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

Редагувати: це працює лише з python 2.x.

Щоб він працював з python 3.x замінити wbна w( див. Цю відповідь ТАК )

with open(..., 'w', newline='') as myfile:
     wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
     wr.writerow(mylist)

11
Зверніть увагу, що csvмодуль в 2.x не справляється належним чином з унікодами; Дивіться документацію модуля для прикладів того, як впоратися з цим. docs.python.org/library/csv.html
Ігнасіо Васкес-Абрамс

14
ви також можете використовувати wr.writerows (список)
tovmeod

4
Здається, Writerows розбиває кожен елемент у списку на стовпці, якщо кожен елемент також є списком. Це досить зручно для виведення таблиць.
whatnick

6
Це не працює з python 3.4. Я отримую TypeError: 'str' does not support the buffer interface.
botchniaque

1
Для Python 2, використовувати , 'w'як тут: stackoverflow.com/questions/34283178 / ...
banan3'14

106

Ось безпечна версія Алекса Мартеллі:

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

3
плюс 1 за користування with, переконайтесь, що файл закритий після завершення
BoltzmannBrain

Якщо я використовую це всередині циклу для циклу, чи повинен вкладатись весь блок під цикл for? Або було б ефективніше мати лише wr.writerow(my_list)всередині циклу?
crypdick

1
@crypdick вам точно не слід ставити весь блок у цикл. Відкрийте файл, а потім запишіть кожен рядок у циклі. Не потрібно відкривати файл n разів, щоб записати n рядків.
Грег Калека

Якщо ви пишете рядкові об’єкти у файл, запропонуйте використовувати "wt" під час відкриття файлу, щоб уникнути TypeError: потрібен об'єкт, подібний до байтів, а не "str".
don_Gunner94

41

Інший підхід, ви можете використовувати DataFrame в панд : І це можна легко скинути дані в CSV - файл так само , як код нижче:

import pandas
df = pandas.DataFrame(data={"col1": list_1, "col2": list_2})
df.to_csv("./file.csv", sep=',',index=False)

1
Дякуємо за цей фрагмент коду, який може надати негайну допомогу. Правильне пояснення значно покращило б його навчальну цінність, показавши, чому це хороше рішення проблеми, і зробило б її кориснішою для майбутніх читачів із подібними, але не однаковими питаннями. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення та вказати, які обмеження та припущення застосовуються.
Toby Speight

5
Також для цього списки повинні мати однакову довжину, інакше ви отримаєте ValueError (pandas v 0.22.0)
chevahagadog

32

Кращий варіант я знайшов був з допомогою savetxtвід numpyмодуля :

import numpy as np
np.savetxt("file_name.csv", data1, delimiter=",", fmt='%s', header=header)

Якщо у вас є кілька списків, які потрібно скласти

np.savetxt("file_name.csv", np.column_stack((data1, data2)), delimiter=",", fmt='%s', header=header)

8
Це добре для чисельної роботи, але воно не буде працювати, якщо в списку відображаються рядки.
Рікардо Крус

12

Використовуйте csvмодуль python для читання та запису файлів з комою або файлами з обмеженими вкладками. Модуль csv є кращим, оскільки він забезпечує хороший контроль над котуванням.

Наприклад, ось спрацьований приклад для вас:

import csv
data = ["value %d" % i for i in range(1,4)]

out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL)
out.writerow(data)

Виробляє:

"value 1","value 2","value 3"

4
Створює порожній файл для мене
caspii

Перший запуск порожній, і ви також не можете його видалити, тому що він відкривається в python. Другий запуск (або точніше: out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL))заповнює дані, незалежно від того, введено ви open("myfile.csv","w")чи новий файл open("myfile2.csv","w"). Здається, що об'єкт не може мати справу з файловим об’єктом, побудованим під час запуску, але зберігає процес виводу як todo. В інших словах: об'єкт із файлу зберігає файловий об’єкт з першого запуску, але пише лише тоді, коли файловий об’єкт вже існує! Дивіться правильне рішення нижче @Saurabh Adhikary
Lorenz

7

У цьому випадку ви можете використовувати метод string.join.

Розділіть декілька рядків для наочності - ось інтерактивна сесія

>>> a = ['a','b','c']
>>> first = '", "'.join(a)
>>> second = '"%s"' % first
>>> print second
"a", "b", "c"

Або як єдиний рядок

>>> print ('"%s"') % '", "'.join(a)
"a", "b", "c"

Однак у вас може виникнути проблема - ваші рядки мають вбудовані цитати. Якщо це так, вам потрібно буде вирішити, як уникнути їх.

Модуль CSV може подбати про все це для вас, дозволяючи вибирати між різними варіантами котирування (усі поля, лише поля з лапками та сепараторами, лише нечислові поля тощо) та способом есактіровать контрольні показники (подвійні лапки або вирвані струни). Якщо ваші значення прості, string.join, ймовірно, буде добре, але якщо вам доведеться керувати безліччю крайових справ, використовуйте доступний модуль.


3

Це рішення звучить божевільно, але працює гладко, як мед

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL,delimiter='\n')
    wr.writerow(mylist)

Файл записується csvwriter, тому властивості csv зберігаються, тобто розділяються комами. Розмежувач допомагає в основній частині, переміщуючи елементи списку в наступний рядок, кожен раз.


1
Такий маленький і такий швидкий
Ян Самц

1
працює, і якщо у вас є вкладений список, розширюючи приклад @ vy32, у вас є:data = [["value %d" % i, "value %d" % (i+1)] for i in range(1,4)] with open("myfile.txt","w") as f: out = csv.writer(f, quoting=csv.QUOTE_ALL, delimiter='\n') out.writerow([';'.join(x) for x in data])
Lorenz

це справді звучить божевільно? Я думаю, це звучить ідеально
Стефані Оуен

3

Створення та запис у файл csv

Наведений нижче приклад демонструє створення та запис файлу csv. щоб зробити динамічний файл-записувач, нам потрібно імпортувати пакет імпорту CSV , тоді потрібно створити екземпляр файлу із посиланням на файл Ex: - with open ("D: \ sample.csv", "w", newline = "" ) як file_writer

тут, якщо файлу не існує згаданого каталогу файлів, тоді python створить той самий файл у вказаному каталозі, а "w" являє собою запис, якщо ви хочете прочитати файл, то замініть "w" на "r" або додайте до існуючого файлу, тоді "a". newline = "" вказує, що він видаляє зайвий порожній рядок кожного разу, коли ви створюєте рядок, щоб усунути порожній рядок, ми використовуємо newline = "", створіть деякі імена полів (назви стовпців), використовуючи список, наприклад поля = ["Імена", "Вік "," Class "] , а потім застосуйте до екземпляра Writer, наприклад, письменник = csv.DictWriter (file_writer, імена полів = поля) тут, використовуючи словник Writer та призначаючи назви стовпців, для запису імен стовпців до csv ми використовуємо write . , при написанні значень файлів потрібно передавати методом словника, тут ключ - назва стовпця, а значення - відповідне значення ключа

import csv 

with open("D:\\sample.csv","w",newline="") as file_writer:

   fields=["Names","Age","Class"]

   writer=csv.DictWriter(file_writer,fieldnames=fields)

   writer.writeheader()

   writer.writerow({"Names":"John","Age":21,"Class":"12A"})

2

Зошит Юпітера

Скажемо, що ваш список є A

Тоді ви можете кодувати наступне оголошення, воно матиметься як файл csv (лише стовпці!)

R="\n".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()

1

ви повинні використовувати модуль CSV напевно, але шанси є, вам потрібно написати unicode. Для тих, кому потрібно написати Unicode, це клас із прикладної сторінки, який можна використовувати як модуль утиліти:

import csv, codecs, cStringIO

class UTF8Recoder:
    """
    Iterator that reads an encoded stream and reencodes the input to UTF-8
    """
    def __init__(self, f, encoding):
        self.reader = codecs.getreader(encoding)(f)

def __iter__(self):
    return self

def next(self):
    return self.reader.next().encode("utf-8")

class UnicodeReader:
    """
    A CSV reader which will iterate over lines in the CSV file "f",
    which is encoded in the given encoding.
    """

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    f = UTF8Recoder(f, encoding)
    self.reader = csv.reader(f, dialect=dialect, **kwds)

def next(self):
    row = self.reader.next()
    return [unicode(s, "utf-8") for s in row]

def __iter__(self):
    return self

class UnicodeWriter:
    """
    A CSV writer which will write rows to CSV file "f",
    which is encoded in the given encoding.
"""

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    # Redirect output to a queue
    self.queue = cStringIO.StringIO()
    self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
    self.stream = f
    self.encoder = codecs.getincrementalencoder(encoding)()

def writerow(self, row):
    self.writer.writerow([s.encode("utf-8") for s in row])
    # Fetch UTF-8 output from the queue ...
    data = self.queue.getvalue()
    data = data.decode("utf-8")
    # ... and reencode it into the target encoding
    data = self.encoder.encode(data)
    # write to the target stream
    self.stream.write(data)
    # empty queue
    self.queue.truncate(0)

def writerows(self, rows):
    for row in rows:
        self.writerow(row)

1

Ось ще одне рішення, яке не потребує csvмодуля.

print ', '.join(['"'+i+'"' for i in myList])

Приклад:

>>> myList = [u'value 1', u'value 2', u'value 3']
>>> print ', '.join(['"'+i+'"' for i in myList])
"value 1", "value 2", "value 3"

Однак, якщо початковий список містить деякі ", вони не будуть уникнути. Якщо це потрібно, можна викликати функцію, щоб уникнути його так:

print ', '.join(['"'+myFunction(i)+'"' for i in myList])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.