2016-02-28 39 views
0

第一个问题在这里可以原谅礼仪中的任何失误。下载“csv-like”文本数据文件,并将其转换为python格式的CSV文件

我是新来的蟒蛇。我有一个小型项目,我试图通过实际的理由和学习经历来完成,也许这里有些人可以帮助我。有一个我经常从中检索数据的专有系统。不幸的是,他们不使用标准的CSV格式。他们使用一个奇怪的角色来分离数据,它是一个‡。我需要CSV格式的文件才能导入到另一个系统。所以我需要做的是采取的数据和替换特殊字符(用逗号)和格式化数据通过删除其他小事情,如无法识别的字符等空白......所以这是我需要它在CSV导入它的方式。

我想学习一些python,所以我想我会写在Python中。我将从webservice 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号线在 f.writerow([ELEM [ “PlayerID”],ELEM [ “合伙人”]]) 类型错误:字符串索引必须是整数

它通过可能是明显我不知道如何操纵数据,也没有正确读取数据。我能够撤回一些JSON数据并输出它,所以我知道这个结构在标准化数据的核心工作。

在此先感谢您的任何提示。

我会继续捅它。

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

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

+0

'elem'是字符串'data'中的一个字符。 – Forge

回答

1

存在多个问题。首先,链接不正确,因为它返回html。要获取原始文件,使用方法:

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

然后,数据是一个字符串,所以elem in data会遍历字符串,这是不是你想要的在所有的字符。

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


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

导入请求 导入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 
+0

令人惊叹。只是复制和粘贴,它马上就可以工作。 非常感谢! 我会马上回答。我只是先读一下,我想完全理解它。这并不难,但我想确保我知道。我会发布任何问题,如果你不介意回答他们,只要你看到他们。 再次感谢您的答复! –

+0

太棒了,另一个脚本kiddy得到他们的翅膀感谢所以SO –

+0

@JarrodRoberson不知道得到您的评论。这是正面还是负面?如果我做错了,请马上告诉我,儿子我下次不会这样做。 – Derlin

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

+0

谢谢我正在尝试合并此。它给了我一个ASCII码错误。它不喜欢脚本中的‡。我可以使用HTML或其他方式来表示角色吗?还是我需要包括一些东西来支持这个字符? –

+0

已更新答案@CarverStone – Forge

+1

谢谢。我应该首先使用Google搜索,我的不好:P –

相关问题