【问题标题】:How to Read a CSV file into a dataframe from FTP in python [duplicate]如何在python中从FTP将CSV文件读入数据帧[重复]
【发布时间】:2020-01-21 07:32:55
【问题描述】:

对于 Python 和 FTP 组合的文件读取方面,我真的很陌生。我搜索了整个 google 和 Stack,但找不到适合我的问题的有效解决方案。

我的问题如下。

我有一个 FTP 位置 - 下面是虚拟详细信息。

  1. 位置:ftp.xyz.com
  2. 用户名:随机
  3. 密码:密码
  4. 文件名:testreport.csv
  5. 文件路径:根文件夹/testfolder/

文件有20列10000行数据

我希望创建一个数据框“df”,它将使用 Python 从 testreport.csv 文件中捕获所有行。有没有办法直接将其发布到数据框而不是先下载?

有没有我可以使用的代码?我正在使用 Python 3。 任何帮助表示赞赏。

【问题讨论】:

标签: python python-3.x pandas file ftp


【解决方案1】:

20 列和 10000 行并没有那么大,所以除非您正在使用存储空间很小的嵌入式系统,最简单的方法是使用 ftplib 下载文件,然后使用 @987654323 将其加载到数据帧中@(见 NicolasDupuy 的回答)。

如果您确实出于任何原因想要避免将其存储在本地磁盘上,这将有点棘手,因为 pandas read_csv 无法从流中读取并且需要一个纯文件。这意味着您必须手动解析文件或仅使用csv 模块,然后从中提供数据帧。

代码可以是:

import csv
import ftplib
import pandas as pd

FTP = ftplib.open('ftp.xyz.com', 'random', 'password')
FTP.cwd('rootfolder/testfolder')

first = True     # to identify the header line
data = []
columns = None

def process_row(line):
    global columns
    if first:
        columns = parse(line)
        first = False
    else:
        data.append(parse(line))

def parse(line):
    # Assume trivial csv file here - use the csv module for more complex use cases
    return line.decode().strip().split(',')

FTP.retrline('RETR testreport.csv', process_row)

df = pd.Dataframe(data = data, columns = columns)
# or for automatic conversion to float:
# df = pd.Dataframe(data = data, columns = columns, dtype = float)

小心:

  • 以上代码未经测试,可能包含拼写错误...
  • 以上代码不包含异常处理,如果输入不正确会不安全
  • 由于您不能使用 read_csv,因此您无法神奇地猜测列类型

换一种说法:除非你有充分的理由这样做,否则不要使用它,只需先下载文件....

【讨论】:

  • 我不确定你是对的——read_cvs 接受一个类似文件的对象。请参阅Read FTP file contents in Python and use it at the same time for Pandas and directly(我已经在问题中发布了此链接)。
  • @MartinPrikryl:嗯,它接受一个类似文件的对象,但 AFAIK 要求它是可搜索的,这很难从 ftp 流中获得。
  • 但是您可以将内容下载到BytesIOStringIO 并且您不需要所有process_row/parse 机器。这就是引用问题中的代码所做的。我相信它和你的代码一样,但只有 4 行。
  • @MartinPrikryl;你说的对。这个解决方案之所以有趣,只是因为它演示了如何在在飞行中 处理流而不需要完全下载文件。但是,当目标是将其放入熊猫数据框中时,它几乎没有用......无论如何,我会让 on the flight 部分的答案。
  • 如果将文件逐行处理成 Pandas,您的回答会很有用。然后它会更有效率,因为它会阻止文件在内存中两次(一次作为未解析的文本,一次在 Pandas 中解析)。
猜你喜欢
  • 2013-06-24
  • 2017-06-03
  • 2021-12-19
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 2017-07-19
  • 2019-01-29
  • 2014-04-11
相关资源
最近更新 更多