在 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;
我必须将在线 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;