【问题标题】:Read csv from url one line at the time in Python 3.X在 Python 3.X 中一次从 url 读取 csv 一行
【发布时间】:2018-05-10 18:51:20
【问题描述】:

我必须将在线 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 秒才能将它们全部上传。

【问题讨论】:

    标签: python python-3.x csv urllib2


    【解决方案1】:

    csv.reader 期望像文件这样的对象而不是字符串作为参数。你有两个选择:

    • 要么您将数据读入字符串(就像您目前所做的那样),然后使用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;
      

    【讨论】:

    • 谢谢,这正是我想要的!
    【解决方案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)
    

    【讨论】:

    • 这是我做的第一件事,它就像一个魅力。但是,当我必须将 data.frame 上传到 postgresql 数据库时,速度非常慢,除非我将 data.frame 转换回 csv 格式。我习惯于在 R 中工作,这将是一个两线问题:1)将数据读入 data.frame,2)将 data.frame 导出到 postgresql。 python中一定也有一些优雅的方式,但是我还没有找到。
    • @EsbenEickhardt pandas 可以选择将数据帧转换回 csv.Here
    • @EsbenEickhardt 当你说你必须上传 vs 导出 df 到 postgresql 时你是什么意思? R 会在您的 export 函数中为您上传吗?如果您可以提供更多详细信息,则可能会更进一步;问题是,是什么导致您上传/导出缓慢?对我来说,上传(远程)与导出(本地)不同。
    • @MushroomMauLa 我无法转换为 csv。 dataframe.to_csv 似乎只是导致另一个熊猫数据框。
    • @stucash 这是一个远程数据库,我一直在使用 sqlalchemy 和函数 to_sql()。它超时,而 R 中的 dbWriteTable() 函数都创建模式并在 i 毫秒内上传数据帧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 2013-10-11
    • 2013-09-15
    相关资源
    最近更新 更多