繁体   English   中英

在Python 3.X中一次从网址读取csv

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM