Программа, которая берет список чисел 1, 1000, меняет их, помещает в файл (называемый my_file) и печатает их обратно в my_file [duplicate]

Вы можете сделать это:

  width: auto;  обивка: 20px;   
114
задан Austin Cummings 17 March 2014 в 23:48
поделиться

11 ответов

import csv

with open(..., 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)
163
ответ дан Kasramvd 15 August 2018 в 21:15
поделиться
  • 1
    Обратите внимание, что модуль csv в 2.x не работает должным образом с юникодами; см. документацию по модулю для примеров того, как справиться с этим. docs.python.org/library/csv.html – Ignacio Vazquez-Abrams 18 January 2010 в 08:39
  • 2
    вы также можете использовать wr.writerows (list) – tovmeod 26 December 2011 в 00:29
  • 3
    Кажется, что Writerows разбивает каждый элемент в списке на столбцы, если каждый элемент также является списком. Это очень удобно для вывода таблиц. – whatnick 7 October 2014 в 06:22
  • 4
    О, открытие файла в режиме 'w' решило проблему. – botchniaque 15 September 2015 в 13:25
  • 5
    open(filename, 'w', newline='') сделал трюк для меня. – Dennis Jaheruddin 4 April 2016 в 12:35
import csv

with open("file.csv", 'w') as myfile:
     wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
     wr.writerow(mylist)
0
ответ дан biniam_Ethiopia 15 August 2018 в 21:15
поделиться
  • 1
    То же, что и stackoverflow.com/a/21872153/4982729 ответ выше. – markroxor 17 January 2018 в 07:19
  • 2
    Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно , как и , почему он решает проблему, улучшит долгосрочную ценность ответа. – Alexander 2 March 2018 в 18:43
  • 3
    @markroxor Я так не думаю, что другой ответ напишет двоичную форму wb, этот ответ только записывает wthout двоичный код, который не является тем же – hisi 4 March 2018 в 14:19
  • 4
    @ Александр, когда я получу больше знаний об этом, чтобы не сказать что-то не так. благодаря – hisi 4 March 2018 в 14:22

Вот безопасная версия Alex Martelli's:

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)
78
ответ дан Cristian Garcia 15 August 2018 в 21:15
поделиться
  • 1
    плюс 1 для использования with, следя за тем, чтобы файл был закрыт – BoltzmannBrain 15 May 2015 в 20:20
  • 2
    Если я использую это внутри цикла for, должен ли весь блок блокироваться в цикле for? Или было бы более эффективным только иметь wr.writerow(my_list) внутри цикла? – crypdick 7 June 2017 в 23:05
  • 3
    @crypdick, вы определенно не должны помещать весь блок в цикл. Откройте файл, затем напишите каждую строку в цикле. Нет необходимости открывать файл n раз для записи n строк. – Greg Kaleka 14 November 2017 в 01:17

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

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
ответ дан kommradHomer 15 August 2018 в 21:15
поделиться

Для другого подхода вы можете использовать DataFrame в pandas : и он может легко сбрасывать данные в csv так же, как код ниже:

import pandas
df = pandas.DataFrame(data={"col1": list_1, "col2": list_2})
df.to_csv("./file.csv", sep=',',index=False)
10
ответ дан Qy Zuo 15 August 2018 в 21:15
поделиться
  • 1
    Благодарим вас за этот фрагмент кода, который может оказать немедленную помощь. Правильное объяснение значительно улучшит его образовательное значение, показав why , это хорошее решение проблемы и сделает его более полезным для будущих читателей с похожими, но не идентичными , вопросов. Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение, и укажите, какие ограничения и допущения применяются. – Toby Speight 5 July 2017 в 09:10
  • 2
    Кроме того, для этого для работы списки должны иметь одинаковую длину, иначе вы получите ValueError (pandas v 0.22.0) – cheevahagadog 3 May 2018 в 21:37

Вот еще одно решение, для которого не требуется модуль 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])
1
ответ дан Richard 15 August 2018 в 21:15
поделиться

В этом случае вы можете использовать метод 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 может позаботиться обо всем этом для вас, позволяя вам выбирать между различными параметрами кавычек (все поля, только поля с кавычками и разделителями, только не числовые поля , и т. д.), и как с помощью esacpe control charecters (двойные кавычки или экранированные строки). Если ваши значения просты, string.join, вероятно, будет в порядке, но если вам нужно управлять множеством случаев, используйте доступный модуль.

6
ответ дан Robert Christie 15 August 2018 в 21:15
поделиться

Блокнот Jupyter

Предположим, что ваш список A

Затем вы можете запрограммировать следующее объявление, которое вы получите в виде файла csv (только для столбцов!)

R="\n".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()
0
ответ дан rsc05 15 August 2018 в 21:15
поделиться

Лучший вариант, который я нашел, это использовать savetxt из модуля numpy :

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

Если у вас есть несколько списков, которые должны быть stacked

np.savetxt("file_name.csv", np.column_stack((data1, data2)), delimiter=",", fmt='%s', header=header)
13
ответ дан tokenizer_fsj 15 August 2018 в 21:15
поделиться
  • 1
    Это полезно для числовой работы, но она не будет работать при отображении строк в списке. – Ricardo Cruz 19 December 2015 в 03:42

Используйте модуль 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"
12
ответ дан vy32 15 August 2018 в 21:15
поделиться
1
ответ дан Saurabh Adhikary 29 October 2018 в 04:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: