Как перебирать текстовые файлы, читать первые n строк и записывать в список или фрейм данных?

#python #python-3.x

#python #python-3.x

Вопрос:

Я работаю примерно с 3700 текстовыми файлами и пытаюсь лучше понять содержимое каждого из них. Некоторые файлы точно такие же и изменяются только на четверть, а некоторые отличаются. Я подумываю о том, чтобы перебирать каждый файл, открывать их один за другим и записывать содержимое первых 3 или 4 или 5 строк в список, чтобы я мог лучше понять, какие файлы имеют одинаковую схему. Вот код, который я собрал.

 import pandas as pd
import csv
import glob
import os

results = pd.DataFrame([])
filelist = glob.glob("C:\Users\ryans\Downloads\*.txt")
number_of_lines = 3
for filename in filelist:
    for i in range(number_of_lines):
        print(filename)  
        namedf = pd.read_csv(filename, skiprows=0, index_col=0)
        results = results.append(namedf)
 

Вот полная трассировка стека.

         results = results.append(namedf)
C:UsersryansDownloadsFFIEC CDR Call Bulk POR 03312001.txt
Traceback (most recent call last):

  File "<ipython-input-14-64ec4bc99b05>", line 12, in <module>
    namedf = pd.read_csv(filename, skiprows=0, index_col=0)

  File "C:UsersryansAnaconda3libsite-packagespandasioparsers.py", line 686, in read_csv
    return _read(filepath_or_buffer, kwds)

  File "C:UsersryansAnaconda3libsite-packagespandasioparsers.py", line 458, in _read
    data = parser.read(nrows)

  File "C:UsersryansAnaconda3libsite-packagespandasioparsers.py", line 1196, in read
    ret = self._engine.read(nrows)

  File "C:UsersryansAnaconda3libsite-packagespandasioparsers.py", line 2155, in read
    data = self._reader.read(nrows)

  File "pandas_libsparsers.pyx", line 847, in pandas._libs.parsers.TextReader.read

  File "pandas_libsparsers.pyx", line 862, in pandas._libs.parsers.TextReader._read_low_memory

  File "pandas_libsparsers.pyx", line 918, in pandas._libs.parsers.TextReader._read_rows

  File "pandas_libsparsers.pyx", line 905, in pandas._libs.parsers.TextReader._tokenize_rows

  File "pandas_libsparsers.pyx", line 2042, in pandas._libs.parsers.raise_parser_error

ParserError: Error tokenizing data. C error: Expected 1 fields in line 3, saw 2
 

Как я могу заставить этот код работать? Кроме того, это лучший способ продолжить или есть лучший способ работать с этими 3700 текстовыми файлами?

Комментарии:

1. Пожалуйста, покажите полную обратную трассировку

2. Добавление к df в цикле крайне неэффективно; он будет копировать df в новую память на каждой итерации. Вместо этого вы можете получить предварительно выделенную память для этого, если передадите все dfs за один раз. Но 13 КБ — это много

3. Я только что обновил свой OP с помощью полной трассировки стека.

Ответ №1:

  1. Нет смысла читать все файлы, если в худшем случае вы хотите прочитать 5 строк.

    используйте nrows=5 опцию pd.read_csv()

  2. Исключение, которое вы получаете, связано с тем, что вы предполагаете, что все файлы являются законными файлами csv. но в вашем случае файл с ошибкой

«Ожидалось 1 поле в строке 3, увидел 2»

Вы должны обрабатывать ошибки (попробуйте и исключите) в этих случаях и поддерживать список недопустимых файлов csv.

Комментарии:

1. Я думаю, это имеет смысл! Однако, когда я тестировал это на 3 файлах, я увидел один с полем с именем ‘RIADC899’ в столбце O, и в том же столбце у меня есть два файла с именем ‘ОБЩИЙ ПРОЦЕНТНЫЙ ДОХОД В ИНОСТРАННОЙ ВАЛЮТЕ’. Есть похожие случаи. Я вижу в столбце P поле с именем ‘RIADC900’, а под ним — ‘ОБЩИЕ ПРОЦЕНТНЫЕ РАСХОДЫ В ИНОСТРАННЫХ ПОДРАЗДЕЛЕНИЯХ’. Почему бы не создать новые столбцы для этих новых имен столбцов?

2. трудно следовать. Пожалуйста, обновите свой вопрос с помощью этих примеров.

Ответ №2:

 import glob
results = []
filelist = glob.glob("C:\Users\ryans\Downloads\*.txt")
number_of_lines = 3
for filename in filelist:
    print(filename)
    f =open(filename,"w")
    lines = f.readlines()
    results.append(lines[:number_of_lines])
print(results)