将csv文件解析为对象数组。

问题描述 投票:0回答:1

我刚刚把我用JS(node)做的一些动作转换为Python(flask webserver)--连接到安全的FTP服务,并从那里读取和解析一个CSV文件,因为我知道用Python更快。

所以这是我的代码。

import urllib.request
import csv
import json
import pysftp
import pandas as pd
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None

name = 'username'
password = 'pass'
host = 'hostURL'
path = ""
with pysftp.Connection(host=host, username=name, password=password, cnopts=cnopts) as sftp:
    for filename in sftp.listdir():
        if filename.endswith('.csv'):
            file = sftp.open(filename)
            csvFile = file.read()

我到了可以看到CSV文件内容的部分,但我不能很好地解析(就像我需要它的格式化--对象数组)。

我试着用:

with open (csvFile, 'rb') as csv_file:
    print(csv_file)
    cr = csv.reader(csv_file,delimiter=",") # , is default
    rows = list(cr)

和这个:

Past=pd.read_csv(csvFile,encoding='cp1252')
print(Past)

但我得到了这样的错误。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 748: invalid start byte

OSError: Expected file path name or file-like object, got <class 'bytes'> type

(还有一个问题--不重要,只是想知道我是否可以根据最新的日期从ftp中检索一个文件--因为有时一个仓库中可能有多个文件。)

python python-3.x pandas ftp
1个回答
0
投票

如果你不介意使用Pandas (和Numpy)

潘达斯 read_csv 接受一个文件路径或一个文件对象 (docs). 更具体地说,它提到了。

我们所说的类文件对象是指具有read()方法的对象,比如文件处理程序(比如通过内置的打开函数)或StringIO。

在这个意义上,使用任何一个 filenamefile 在你的例子中,应该可以使用。

鉴于此,如果使用pandas选项,请尝试将你的代码替换为。

df = pd.read_csv(filename, encoding='cp1252') # assuming this is the correct encoding
print(df.head()) # optional, prints top 5 entries

df 现在是一个Pandas 数据帧. 要将DataFrame转换为一个对象数组,可以尝试使用 to_numpy 办法 (docs):

arr = df.to_numpy() # returns numpy array from DataFrame
© www.soinside.com 2019 - 2024. All rights reserved.