簡體   English   中英

如何在Python中讀取格式化的文件?

[英]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

https://regex101.com/r/wV5tP1/12

它看起來像你編寫規則就是分裂的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM