[英]How do I read a formatted file in Python?
我需要從格式如下的文件中讀取數據:
Jamestown 20 Rocky Mountain 34
Illinois St 28 Ball St 51
Tulsa 7 Bowling Green 34
我需要Python一次讀取一行,並同時獲得兩個團隊的名稱(“ Jamestown”和“ Rocky Mountain”)以及兩個得分(“ 20”和“ 34”)。
我將如何去做呢? 我嘗試編寫此代碼以查看是否只能讀取團隊名稱,但是由於某種原因,它不起作用。
oneSpace = False
for char in fileline:
if char == ' ':
if oneSpace:
team1 = team1[:-1]
return
else:
oneSpace = True
team1 = team1 + char
else:
team1 = team1 + char
oneSpace = False
import re
ll=[]
for line in file.readlines():
ll.append(re.findall(r"(.*?)\s{2,}(\d+)",line)
print ll
它看起來像你想編寫規則就是分裂的2個或更多空間的任何運行。 有更簡單的方法可以做到這一點。 例如:
bits = [bit for bit in line.split(' ') if bit]
bits = re.split(r'\s\s+', line)
但是,我不確定這首先是否是此文件的正確規則。 當事物處於固定位置時,您可能想根據這些固定位置來解析它們:
team1 = line[:34].rstrip()
score1 = line[34:37].rstrip()
…等等
為什么? 因為考慮當您得到這樣的一行時會發生什么:
Team With a Really Long College Name28 Ball St 51
輸出可能會截斷名稱,以確保至少有一個空格。 它甚至可能會截斷以確保至少有兩個空格。 但是,除非您知道他們將要這樣做的事實,否則您的邏輯將被打破。 而按實際列的位置保證可以做正確的事。
還有一件事:您確定列只是由空格而不是制表符分隔嗎? 因為如果字符串真的像這樣:
Tulsa\t 7\tBowling Green\t34
…那么您應該只使用line.split('\\t')
-或更好的是csv.reader(file, delimiter='\\t', skipinitialspace=True)
。
盡管您的代碼過於復雜,但可以使其僅需進行少量更改即可工作,並且必須以這種方式編寫現實生活中的程序,因為與這種情況不同 ,沒有更簡單的解決方案。
因此,讓我們仔細研究一下。
您的第一個問題是,在嘗試修改team1
之前,請不要為其分配任何起始值。 那可能行不通; 嘗試訪問不存在的值時,您將立即收到UnboundLocalError
。
但這也很容易解決:如果您希望team1
以空字符串開頭,可以在其中附加其他字符,只需將其添加到函數的開頭即可:
team1 = ''
第二個問題是,在完成計算team1
所有工作之后,您什么都不return
,因此結果始終為None
。 這也很容易解決:將return
語句更改為:
return team1
如果您同時解決了這兩個問題,那么一切都會正常! 您可以在此在線解釋器會話中看到它的運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.