#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:
- Нет смысла читать все файлы, если в худшем случае вы хотите прочитать 5 строк.
используйте
nrows=5
опциюpd.read_csv()
- Исключение, которое вы получаете, связано с тем, что вы предполагаете, что все файлы являются законными файлами 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)