【问题标题】:Pandas: Dataframe from ftp filePandas:来自 ftp 文件的数据框
【发布时间】:2019-05-14 09:11:30
【问题描述】:

我想将我通过 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="#")

但由于某种原因,df 中缺少前约 850 行,第一行完全混乱。

【问题讨论】:

    标签: python pandas dataframe ftp


    【解决方案1】:

    问题是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="#")
    

    您不是从文件的开头开始,而是从第一次读取停止的地方开始,因此缺少行和混乱的第一行。

    不幸的是,我不知道简单的解决方法,所以恕我直言,您只有两种简单的方法:

    • 将流写入临时文件,处理后您将删除该文件。由于您现在拥有一个真实文件,因此您可以根据需要多次打开它
    • 一次性处理流 - 但您必须在代码中更改很多内容

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多