2016-09-26 83 views
-1

我想這是兩個問題的組合 - 閱讀在線文本文件,然後將結果解析爲列表。我嘗試下面的代碼,它可以讀取文件到字節的文件,但無法將其轉換成列表在Python 3.5解析在線逗號分隔的文本文件

import urllib 
CFTC_URL = r"http://www.cftc.gov/dea/newcot/FinFutWk.txt" 
CFTC_url = urllib.request.urlopen(CFTC_URL) 
output = CFTC_url.read().decode('utf-8') 
+0

的可能的複製[我如何分割多行字符串成多行?] (http://stackoverflow.com/questions/172439/how-do-i-split-a-multi-line-string-into-multiple-lines) – SiHa

回答

2

您可以使用非標準csv模塊StringIO包裝的文件內容(例如與requests庫獲取數據):

import requests, io, csv 

CFTC_URL = r"http://www.cftc.gov/dea/newcot/FinFutWk.txt" 
data = io.StringIO(requests.get(CFTC_URL).text) 

dialect = csv.Sniffer().sniff(data.read(1024)) 
data.seek(0) 
reader = csv.reader(data, dialect) 
for row in reader: 
    print(row) 
0

,而不是試圖解析從URL中的每一行並付諸具體的行以csv文件,你可以只是將它全部推送到一個文本文件中以清理格式化,然後從中讀回,這可能看起來有點多作品,但這通常是我從URL獲取逗號分隔信息的方法。

import requests 
URL = "http://www.cftc.gov/dea/newcot/FinFutWk.txt" 
r = requests.get(URL,stream=True) 
with open('file.txt','w') as W: 
    W.write(r.text) 
with open('file.txt', 'r') as f: 
    lines = f.readlines() 

for line in lines: 
    print(line.split(',')) 

你可以採取什麼是在for循環和交換它周圍的實際保存列表到列表的數組,所以你可以使用,而不是打印出來。

content = [] 
for line in lines: 
    content.append(line.split(',')) 

還要注意的是在分裂,你還是會發現有是具有後相當大量的白色空間的內容,您可以通過整個列表運行,數組中的每個列表,並刪除所有的空白區域,但這會毀掉列表中的第一個元素,或者只是將具有空格的數值轉換爲實際整數,因爲它們是以字符串形式讀入的。這將是你的偏好。如果您有任何問題,請隨時在下面添加評論。

編輯1: 請注意,如果您不希望保留隨內容保存的文件,請導入os庫,然後在將行讀入行數組後,刪除該文件。

import os 
os.remove('file.txt') 
0

假設你要解釋文件,只要你想通過split先獲得行的表。然後你可以通過再次分割每一行來獲得列。

import urllib.request 
CFTC_URL = r"http://www.cftc.gov/dea/newcot/FinFutWk.txt" 
CFTC_url = urllib.request.urlopen(CFTC_URL) 
output = CFTC_url.read().decode('utf-8') 
lines = output.split("\r\n"))) # split on newline 
print(lines[0]) # first line "CANADIAN DOLLAR ..." 
columns_0 = lines[0].split(",") # split on , 
print(columns[0]) # first column of first line 

您可以再通過線的列表,並在您可以通過列循環線的每個條目進行迭代。