Разобрать CSV-файл для массива объектов - PullRequest
1 голос
/ 03 мая 2020

Я только что преобразовал действие, которое я совершил с JS (узел), в Python (flask веб-сервер) - подключение к защищенной службе FTP, чтение и анализ оттуда CSV-файлов, потому что я знаю, что это быстрее с Python. Мне удалось сделать почти все, но я испытываю определенные трудности с хорошим анализом файла CSV.

Так вот мой код:

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 на основе самой последней даты - потому что иногда в хранилище может быть более 1 файла.)

1 Ответ

0 голосов
/ 03 мая 2020

Если вы не возражаете против использования Pandas (и Numpy)

Pandas 'read_csv принимает путь к файлу или объект файла ( документы) . Более конкретно, в нем упоминается:

По объектам, похожим на файл, мы ссылаемся на объекты с методом read (), такими как обработчик файлов (например, через встроенную функцию open) или 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 . Чтобы преобразовать DataFrame в массив объектов, попробуйте метод to_numpy (docs) :

arr = df.to_numpy() # returns numpy array from DataFrame
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...