python - 在Python 3.X中一次从url一行读取csv

标签 python python-3.x csv urllib2

我必须将在线 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.reader 期望作为参数的是类似文件的对象而不是字符串。您这里有 2 个选择:

  • 要么将数据读入字符串(就像您当前所做的那样),然后使用 io.StringIO 围绕该字符串构建一个类似文件的对象:

    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;
    

关于python - 在Python 3.X中一次从url一行读取csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47512524/

相关文章:

python - 为什么这两个 tr 被 lxml 解析为相同的第一个 tr?

python - 如何使用下一个按钮python更改标签(图像形式)

python - 比较数组中的 np.nan 时 "less"中的无效值

Python Pandas - 查找并分组异常值

python - 在 python flask 中使用游标对 postgres 查询进行分页

python - 如何防止并发 future 库循环遍历先前迭代的项目?

python - 在 CSV 文件中搜索特定字符串时遇到问题

perl - 使用 Text::CSV 写入 CSV 文件是否有单元格长度限制?

python - 使用python对csv文件进行排序

python - setup.py 从 bdist 中排除一些 python 文件