Панды: датафрейм из файла ftp - PullRequest
0 голосов
/ 14 мая 2019

Я хочу поместить содержимое большого текстового файла, разделенного табуляцией, который я извлекаю через ftp, непосредственно в кадр данных pandas.

import pandas as pd
import urllib.request as ur

# retrieve only the header column & set dtype to save some memory
refseq_summary = "ftp://ftp.ncbi.nlm.nih.gov/genomes/refseq/assembly_summary_refseq.txt"
req = ur.Request(refseq_summary)
z_f = ur.urlopen(req)
col_names = pd.read_csv(z_f, sep='\t', nrows=0, skiprows=1)

for col in list(col_names.columns[:]):
    col_names[col] = col_names[col].astype("object")
col_names["taxid"]= col_names["taxid"].astype("Int64")
col_names.rename(columns={'# assembly_accession':'assembly_accession'}, inplace=True)
col_dtypes = col_names.dtypes.to_dict()
col_names_list = list(col_names.columns.values)

# read the whole file, and set the dtype & column names
df = pd.read_csv(z_f, sep='\t', dtype=col_dtypes, names=col_names_list, comment="#")

Но по некоторым причинам первые ~ 850 строк отсутствуют в df, а первая строка полностью запуталась.

1 Ответ

0 голосов
/ 14 мая 2019

Проблема в том, что возвращаемое значение urlopen - это не простой файл, а поток, поэтому его можно прочитать только один раз.Таким образом, после первого read_csv:

col_names = pd.read_csv(z_f, sep='\t', nrows=0, skiprows=1)

вы уже прочитали часть потока - эта часть не определена и зависит от реализации read_csv.

Итак, на второмпрочитайте:

df = pd.read_csv(z_f, sep='\t', dtype=col_dtypes, names=col_names_list, comment="#")

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

К сожалению, я не знаю, нетпростой обходной путь, поэтому ИМХО у вас есть только 2 простых способа:

  • записать поток во временный файл, который вы удалите после обработки.Теперь, когда у вас есть настоящий файл, вы сможете открывать его столько раз, сколько вам нужно
  • обрабатывать поток за один проход - но вам придется многое изменить в своем коде
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...