下载" csv-like"文本数据文件并在python中将其转换为CSV

时间:2016-02-28 08:08:27

标签: python web-services csv

这里的第一个问题请原谅礼仪中的任何失误。

我是python的新手。我有一个小项目,我试图通过实际原因和学习经验来完成这两个项目,也许这里的一些人可以帮助我。我经常从中检索数据的专有系统。不幸的是,他们没有使用标准的CSV格式。他们使用一个奇怪的字符来分隔数据,它是一个‡。我需要它以CSV格式,以便将其导入另一个系统。所以我需要做的是获取数据并替换特殊字符(使用逗号)并通过删除空白以及其他次要内容(如无法识别的字符等)来格式化数据......所以它是我需要它的方式CSV导入它。

我想学习一些python,所以我想我会用python写它。我将从网络服务URL读取它,但是现在我只有一些我收到的相同格式的测试数据。

实际上每个请求会有大量的数据,但是当我理解如何正确检索和操作数据时,我可以扩展它。

到目前为止,我的代码只是尝试从数据中读取和写入两列:

import requests
import csv

r = requests.get ('https://www.dropbox.com/s/7uhheam5lqppzis/singlelineTest.csv?dl=0')
data = r.text
with open("testData.csv", "wb") as csvfile:
f = csv.writer(csvfile)
f.writerow(["PlayerID", "Partner"]) # add headers
for elem in data:
 f.writerow([elem["PlayerID"], elem["Partner"]])

我收到此错误。  文件" csvTest.py",第14行,in     f.writerow([elem [" PlayerID"],elem [" Partner"]]) TypeError:字符串索引必须是整数

可能很明显,我不知道如何操纵数据,也不知道如何正确阅读。我能够撤回一些JSON数据并将其输出,因此我知道结构在核心处使用标准化数据。

提前感谢任何提示。

我会继续戳它。

示例数据位于脚本中提到的保管箱链接中。

https://www.dropbox.com/s/7uhheam5lqppzis/singlelineTest.csv?dl=0

2 个答案:

答案 0 :(得分:1)

有很多问题。首先,链接不正确,因为它返回html。要获取原始文件,请使用:

r = requests.get ('https://www.dropbox.com/s/7uhheam5lqppzis/singlelineTest.csv?dl=1')

然后,data是一个字符串,因此elem in data将迭代字符串的所有字符,这不是你想要的。

然后,您的数据是unicode,而不是字符串。所以你需要先解码它们。

这是你的程序,有一些变化:

导入请求     import csv

r = requests.get ('https://www.dropbox.com/s/7uhheam5lqppzis/singlelineTest.csv?dl=1')
data = str(r.text.encode('utf-8').replace("\xc2\x87", ",")).splitlines()


headers = data.pop(0).split(",")

pidx = headers.index('PlayerID')
partidx = headers.index('Partner')

with open("testData.csv", "wb") as csvfile:
    f = csv.writer(csvfile)
    f.writerow(["PlayerID", "Partner"]) # add headers
    for data in data[1:]:
      words = data.split(',')  
      f.writerow([words[pidx], words[partidx]])

输出:

PlayerID,Partner
1038005,EXT
254034,EXT

答案 1 :(得分:0)

使用split

lines = data.split('\n')  # split your data to lines

headers = lines[0].split('‡')
player_index = headers.index('PlayerID')
partner_index = headers.index('Partner')

for line in lines[1:]:  # skip the headers line 
  words = line.split('‡')  # split each line by the delimiter '‡'
  print words[player_index], words[partner_index]


为此,请将python源代码的编码定义为UTF-8,方法是将此行添加到文件顶部:

# -*- coding: utf-8 -*-

PEP 0263了解详情。