Сохранение результатов в CSV файл с помощью Python
Описание проблемы:
Я пытаюсь обработать CSV-файл с помощью кода на Python, но получаю странный вывод. Вот что я пытаюсь сделать: я читаю данные из файла test.csv
, подсчитываю количество вхождений значений во втором столбце и записываю строки в новый файл test1.csv
, если количество вхождений этого значения больше или равно 4.
Однако вывод не соответствует моим ожиданиям. Код выглядит следующим образом:
import csv
with open('test.csv', 'rb') as f:
data = list(csv.reader(f))
import collections
counter = collections.defaultdict(int)
for row in data:
counter[row[1]] += 1
for row in data:
if counter[row[1]] >= 4:
writer = csv.writer(open("test1.csv", "wb"))
writer.writerows(row)
Вопрос: Что не так с этим кодом? Почему я получаю неожиданный результат при записи в новый файл CSV?
5 ответ(ов)
Я понимаю, что вопрос касается вашей реализации пакета "csv", но для вашего сведения существуют более простые варианты — например, пакет numpy.
import numpy as np
np.savetxt('data.csv', (col1_array, col2_array, col3_array), delimiter=',')
(Этот ответ был опубликован спустя 6 лет, для сохранения в истории.)
В другом случае, аналогичном вашему вопросу, допустим, у вас есть два столбца, например:
names = ['Имя Игрока', 'Foo', 'Bar']
scores = ['Счет', 250, 500]
Вы можете сохранить их следующим образом:
np.savetxt('scores.csv', [p for p in zip(names, scores)], delimiter=',', fmt='%s')
Файл scores.csv
будет выглядеть так:
Имя Игрока,Счет
Foo,250
Bar,500
Для того чтобы использовать csv.writer
и сохранить отфильтрованные строки в новый CSV файл, вы можете адаптировать ваш код следующим образом:
import csv
import collections
# Считываем данные из исходного CSV файла
with open('thefile.csv', 'r', newline='') as f:
data = list(csv.reader(f))
# Подсчитываем количество вхождений первой колонки
counter = collections.defaultdict(int)
for row in data:
counter[row[0]] += 1
# Записываем отфильтрованные данные в новый CSV файл
with open('/path/to/my/csv/file', 'w', newline='') as out_file:
writer = csv.writer(out_file)
for row in data:
if counter[row[0]] >= 4:
writer.writerow(row)
Вот что следует отметить:
- Я изменил
'rb'
на'r'
и добавил параметрnewline=''
при открытии файла. Это поможет избежать проблем с переносами строк, особенно при работе на разных операционных системах. - Для записи в новый файл также добавлен параметр
newline=''
, чтобы избежать дополнительных пустых строк в Windows. - Убедитесь, что вы указали правильный путь к файлу при записи.
Теперь, если в первой колонке строки встречаются 4 или более раз, они будут записаны в новый CSV файл.
Для сохранения DataFrame в CSV файл с помощью библиотеки Pandas вы можете использовать метод to_csv()
. Вот пример кода:
df.to_csv("your_preferred_name.csv")
В этом коде "your_preferred_name.csv"
— это имя файла, в который вы хотите сохранить данные. После выполнения этой команды DataFrame df
будет записан в указанный CSV файл в текущем рабочем каталоге. Вы также можете указать различные параметры, такие как разделитель, кодировку и другие, в зависимости от ваших требований.
В вашем коде есть небольшая ошибка. Вы не можете закрыть файл, не указав правильный способ записи данных в CSV. Вместо этого вам нужно использовать writerow
для записи строк. Вот исправленный пример:
import csv
fileName = "output.csv"
f = open(fileName, "w", newline='') # Используйте 'w' для текстового режима
writer = csv.writer(f)
entries = "first*second*third".split("*")
writer.writerow(entries) # Используйте writerow для записи строки
f.close()
Обратите внимание, что при открытии файла вы можете использовать параметр newline=''
, чтобы избежать дополнительных пустых строк в выходном CSV-файле. После завершения записи мы закрываем файл.
В приведенном вами примере кода есть несколько недочетов, которые могут вызвать ошибки. Давайте исправим их и сделаем пример более корректным для работы в Python, так как код выглядит как комбинация Python и Java.
Вот исправленный пример, который создаст CSV-файл, используя Python и модуль csv
:
import csv
# Открываем файл для записи в режиме 'w' (запись)
with open("filename.csv", "w", newline='') as csvfile:
writer = csv.writer(csvfile)
# Разбиваем строку на элементы, используя разделитель '#'
entries = "first#second#third".split("#")
# Записываем строки в файл
writer.writerow(entries)
Пояснения:
- Используем
with open(...)
чтобы гарантировать, что файл будет закрыт автоматически после завершения записи. - Открываем файл в режиме
'w'
для записи, а не'wb'
, поскольку для работы с текстовыми файлами в Python 3 лучше использовать текстовый режим. - Добавляем
newline=''
при открытии файла, чтобы избежать дополнительных пустых строк в некоторых версиях Windows. - Используем
writerow()
вместоwriterows()
, так как у нас есть только одна строка для записи.
Теперь этот код будет работать корректно и создаст файл filename.csv
с одной строкой, содержащей значения first, second, third
.
Ошибка UnicodeDecodeError при чтении CSV-файла в Pandas
Импорт нескольких CSV-файлов в pandas и объединение в один DataFrame
CSV-файл, созданный с помощью Python, содержит пустые строки между каждой записью
Разделить строку по запятым, игнорируя запятые внутри двойных кавычек?
Python DictWriter: Запись UTF-8 закодированных CSV файлов