[英]Read .csv file from URL into Python 3.x - _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
[英]Read csv from url one line at the time in Python 3.X
我必须将在线csv文件读取到postgres数据库中,在这种情况下,我在正确读取在线csv文件时遇到了一些问题。
如果我只是导入文件,它将读取为字节,因此必须对其进行解码。 但是,在解码过程中,似乎整个文件都变成了一个长字符串。
# Libraries
import csv
import urllib.request
# Function for importing csv from url
def csv_import(url):
url_open = urllib.request.urlopen(url)
csvfile = csv.reader(url_open.decode('utf-8'), delimiter=',')
return csvfile;
# Reading file
p_pladser = csv_import("http://wfs-kbhkort.kk.dk/k101/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=k101:p_pladser&outputFormat=csv&SRSNAME=EPSG:4326")
当我尝试逐行读取导入的文件时,它一次只能读取一个字符。
for row in p_pladser:
print(row)
break
['F']
您能帮我找出问题出在哪里吗? 我正在使用Python 3.6。
编辑:每个请求我在R中的解决方案
# Loading library
library(RPostgreSQL)
# Reading dataframe
p_pladser = read.csv("http://wfs-kbhkort.kk.dk/k101/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=k101:p_pladser&outputFormat=csv&SRSNAME=EPSG:4326", encoding = "UTF-8", stringsAsFactors = FALSE)
# Creating database connection
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, dbname = "secretdatabase", host = "secrethost", user = "secretuser", password = "secretpassword")
# Uploading dataframe to postgres database
dbWriteTable(con, "p_pladser", p_pladser , append = TRUE, row.names = FALSE, encoding = "UTF-8")
我必须上载几张表以容纳10,000至100,000行,而在R中总共要花1-2秒才能全部上载它们。
如何用熊猫加载CSV!
import pandas as pd
csv = pd.read_csv("http://wfs-kbhkort.kk.dk/k101/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=k101:p_pladser&outputFormat=csv&SRSNAME=EPSG:4326")
print csv.columns
或者,如果您在计算机中下载了CSV,则直接
csv = pd.read_csv("<path_to_csv>")
好! 您可能考虑将定界符和quotechar参数传递给csv.reader,因为CSV也包含引号! 像这样
with open('p_pladser.csv') as f:
rows = csv.reader(f, delimiter=',', quotechar='"')
for row in rows:
print(row)
csv.reader
希望将类似于对象的文件而不是字符串作为参数。 您在这里有2个选项:
您可以将数据读入字符串中(如您当前所做的那样),然后使用io.StringIO
围绕该字符串构建类似于object的文件:
def csv_import(url): url_open = urllib.request.urlopen(url) csvfile = csv.reader(io.StringIO(url_open.read().decode('utf-8')), delimiter=',') return csvfile;
或者您在urllib.request
提供的二进制流周围使用io.TextIOWrapper
:
def csv_import(url): url_open = urllib.request.urlopen(url) csvfile = csv.reader(io.TextIOWrapper(url_open, encoding = 'utf-8'), delimiter=',') return csvfile;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.