Как мне сделать так, чтобы моя программа считывала несколько файлов txt и создавала их во фрейме данных для python? - PullRequest
0 голосов
/ 28 мая 2020

В настоящее время я делаю программу для циклического перебора нескольких файлов txt и превращения их в фреймы данных, чтобы данные можно было анализировать. Я использовал функцию glob, чтобы вернуть список файлов txt. После этого я создал for l oop, который циклически перебирает все элементы в списке. Затем я использую функцию read_csv для чтения этих данных, data.head () для их печати. Я знаю, что мой код, вероятно, действительно глуп, но, пожалуйста, помогите мне его исправить. В настоящее время я не знаю, что делать.

Вот мой исходный код:

import glob
import pandas as pd
path = '/content/gdrive/My Drive/Datapoints/*.txt'
dataframes = []
for filename in glob.glob(path):
  data = pd.read_csv(filename, header=None, delimiter='\t')
  data.head()

По непонятным мне причинам (я новичок в программировании) в моем коде много ошибок:

ParserError                               Traceback (most recent call last)

<ipython-input-52-f940d2e4b46d> in <module>()
      2 dataframes = []
      3 for filename in glob.glob(path):
----> 4   data = pd.read_csv(filename, header=None, delimiter='\t')

3 frames

/usr/local/lib/python3.6/dist-packages/pandas/io/parsers.py in read(self, nrows)
   2035     def read(self, nrows=None):
   2036         try:
-> 2037             data = self._reader.read(nrows)
   2038         except StopIteration:
   2039             if self._first_chunk:

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader.read()

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._read_low_memory()

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._read_rows()

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._tokenize_rows()

pandas/_libs/parsers.pyx in pandas._libs.parsers.raise_parser_error()

ParserError: Error tokenizing data. C error: Expected 9 fields in line 110853, saw 10

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Похоже, что один из ваших CSV имеет некоторую несогласованность, ошибку или вводящую в заблуждение структуру, и pandas не может самостоятельно понять, как его читать. В текущем сообщении ожидается 9 столбцов, но обнаружено 10 столбцов в строке 110853. Это требует дальнейшего изучения, и для этого вам нужно определить, какой файл вызывает это:

Следующий код перехватит исключение ParserError и распечатайте имя файла для вас. Исходя из этого, вы можете начать проверять, что происходит.

path = '/content/gdrive/My Drive/Datapoints/*.txt'
dataframes = []
for filename in glob.glob(path):
    try:
        data = pd.read_csv(filename, header=None, delimiter='\t')
        dataframes.append(data)
    except pd.errors.ParserError as err:
        print(filename)
0 голосов
/ 28 мая 2020

Похоже, в одном из ваших CSV-файлов неверное количество столбцов. Он находится в строке 110853. Вы можете добавить тестовый код для устранения неполадок, например:

import glob
import pandas as pd
path = '/content/gdrive/My Drive/Datapoints/*.txt'
dataframes = []
for filename in glob.iglob(path):
  try:
    data = pd.read_csv(filename, header=None, delimiter='\t')
    data.head()
  except pd.errors.ParserError:
    print(f'Error in file: {filename}')
    raise

Это должно распечатать имя файла, вызывающего проблему.

Обратите внимание, что я изменил От glob.glob(path) до glob.iglob(path), что, вероятно, не будет иметь большого значения, если только у вас нет огромного количества файлов. iglob дает вам итератор, тогда как glob дает список, а затем «за кулисами» таким же образом использует метод list.__iter__. iglob будет немного более эффективным и немного более pythoni c.

Кроме того, блок except заканчивается оператором raise, что обычно является хорошей практикой при обработке исключений. , так как предотвращает потерю информации об ошибке. Это также остановит обработку любых дополнительных файлов, что хорошо в ситуациях, когда ошибка не подлежит исправлению, а код, вызвавший ошибку, не должен продолжать работу.

...