我刚刚把我用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中检索一个文件--因为有时一个仓库中可能有多个文件。)
如果你不介意使用Pandas (和Numpy)
潘达斯 read_csv
接受一个文件路径或一个文件对象 (docs). 更具体地说,它提到了。
我们所说的类文件对象是指具有read()方法的对象,比如文件处理程序(比如通过内置的打开函数)或StringIO。
在这个意义上,使用任何一个 filename
或 file
在你的例子中,应该可以使用。
鉴于此,如果使用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