在 Python 3.X 中一次从 url 一行读取 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 秒才能全部上传。

如何使用 pandas 加载 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>")

好的!您可以考虑将 delimiter 和 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 围绕该字符串构建一个类似对象的文件:

    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;