#python #pandas #csv #bigdata #data-warehouse
Вопрос:
у меня огромный csv, и я попытался отфильтровать данные с помощью open.
Я знаю, что могу использовать FINDSTR в командной строке, но я хотел бы использовать python для создания нового файла, отфильтрованного, или я хотел бы создать фрейм данных pandas в качестве вывода.
вот мой код:
outfile = open('my_file2.csv', 'a')
with open('my_file1.csv', 'r') as f:
for lines in f:
if '31/10/2018' in lines:
print(lines)
outfile.write(lines)
Проблема в том, что сгенерированный выходной файл равен входному файлу и нет фильтра(и размер файла тот же).
Спасибо всем
Комментарии:
1. Близко к опечатке: вам просто нужно
outfile.write(lines)
отступить так же, какprint(lines)
.
Ответ №1:
Проблема с вашим кодом заключается в отступе последней строки. Это должно быть в операторе if, поэтому записываются только строки, которые содержат '31/10/2018'
.
outfile = open('my_file2.csv', 'a')
with open('my_file1.csv', 'r') as f:
for lines in f:
if '31/10/2018' in lines:
print(lines)
outfile.write(lines)
Чтобы отфильтровать с помощью Панд и создать фрейм данных, сделайте что-нибудь в духе:
import pandas as pd
import datetime
# I assume here that the date is in a seperate column, named 'Date'
df = pd.read_csv('my_file1.csv', parse_dates=['Date'])
# Filter on October 31st 2018
df_filter = df[df['Date'].dt.date == datetime.date(2018, 10, 31)]
# Output to csv
df_filter.to_csv('my_file2.csv', index=False)
(Для очень больших csv-файлов посмотрите на pd.read_csv()
аргумент «размер фрагмента»)
Чтобы использовать with open(....) as f:
, вы могли бы сделать что-то вроде:
import pandas as pd
filtered_list = []
with open('my_file1.csv', 'r') as f:
for lines in f:
if '31/10/2018' in lines:
print(lines)
# Split line by comma into list
line_data = lines.split(',')
filtered_list.append(line_data)
# Convert to dataframe and export as csv
df = pd.DataFrame(filtered_list)
df_filter.to_csv('my_file2.csv', index=False)
Комментарии:
1. Спасибо. Знаете ли вы, как я могу использовать отфильтрованные данные в фрейме данных pandas без создания нового файла? или как я могу фильтровать данные по столбцам с помощью своего кода?
2. хорошо, спасибо, но я имею в виду вывод: с открытым(‘my_file1.csv’, ‘r’) как f: для строк в f: если «31/10/2018» в строках: печать(строки)
3. Зачем вам это нужно, если вы все равно собираетесь использовать Панд? Или
'my_file1.csv'
также содержит другие строки, кроме заголовка и строк данных?4. поскольку файл слишком велик, я хотел бы анализировать только выходные данные, полученные с помощью печати(строки). и я не знаю, почему, но в выходном файле(my_file2.csv) отсутствует 10 строк
5. Смотрите решение выше