Как использовать с open для фильтрации файлов данных в python и создания нового файла?

#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. Смотрите решение выше