2016-02-28 67 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 –

相關問題