2010-06-23 70 views

回答

4

文件a.txt打開和讀取線
線對於從文件中的每一行,行分裂的"字符 - >我們會打電話給這些令牌。
在縮進塊的代碼行可能使用這些令牌不知何故

概括地說,將TIS一個文件的內容解析成與任一新行字符或引號字符分隔令牌。

如果輸入文件是:

ab"cdef"g 
h"ijk"lmno"p 
q 

..程序都將將返回令牌:

ab 
cdef 
g\n 
h 
ijk 
lmno 
p\n 
q\n 
+0

感謝您的解釋 – Rajeev 2010-06-23 05:21:57

+2

這是不完全正確的。它會返回'[「ab」,「cdef」,「g」] [「h」,...] ...' – cobbal 2010-06-23 05:39:01

+2

......重要的是,它會將整個文件讀入內存而不是讀取一次一行。不要這樣做。 – 2010-06-23 06:10:18

1

嘗試在部分像this sample運行塊。

+0

感謝您的解釋 – Rajeev 2010-06-23 05:23:46

6
afile = open('a.txt') 
for line in afile: 
    for field in line.split('"'): 
     # do something 

真的是不擁擠這樣一個簡單的多好的理由在這樣一個難以閱讀的表達中的概念。

+0

感謝您的解釋 – Rajeev 2010-06-23 05:23:10

1

嗯,首先,做,如果你有一個文件a.txt爲運行代碼,你會得到什麼說:

「本」,是一個「測試」
在這裏,我們「GO」再次
「援引行「
並沒有引號?

[ '', '這', '是一個', '測試', '\ n']
[ '在這裏,我們', 'GO', '再次的\ n']
[ '' ,''Quoted Line','\ n']
['且沒有引號?\ n']

因此,您將得到每行的列表,其中行列表包含字符串劃分的內容由報價"字符。

因此,嘗試運行這些:

for line in open('a.txt'): 
    print line 

因此,它會遍歷文件a.txt中,這被稱爲開放的線路。

for line in open("a.txt"): 
    line_parts = [line.split('"') for line in open('a.txt')] 
    print line_parts 

即第二行是什麼被稱爲一個List Comprehension和將運行在所述文件的每行分裂的方法。

所以,現在你看到了這些輸出,你可以希望看到它爲什麼在做什麼。讓我知道這是否有道理。我有幾杯飲料:)

0

它會逐行讀取文件'a.txt',並使用分隔符'''進行分割,分割會產生一個列表,一旦讀取結果分裂被分配給'我'即列表的列表。

 
Example: 
Personal firewall "software may warn about the connection IDLE 
Personal firewall "software" may warn about the connection IDLE 
Personal "firewall" "software may warn about the" connection IDLE 
 
Output: 
['Personal firewall ', 'software may warn about the connection IDLE\n'] ['Personal firewall ', 'software', ' may warn about the connection IDLE\n'] ['Personal ', 'firewall', ' ', 'software may warn about the', ' connection IDLE\n'] 
1

除了是否是混淆或不主觀判斷,要了解它,你需要查找列表理解Python中,並用那裏的功能。

列表理解是一種創建列表的方式,既可以提高性能又可以提高字符佔用空間,但代價是可讀性。

IE:你有一個列表[1,2,3],你想一個包含相同的元素與1添加到每個,你可以不喜歡

originalList = [1,2,3,4] 
newList = [x+1 for x in originalList] 
print newList 

這會變得更加有趣(偶爾不可讀)當你引入lambdas和多維度時。

考慮到這一點,爲了解開這行代碼,你必須向後看。 open()會在這種情況下得到文本文件的內容。 因此,對於open()中的行來說,它會捕獲返回值並對其進行迭代,從而爲每次迭代提供一行文件,這就是示例中的「x in originalList」部分。

你的迭代器的內容在列表理解中是一個字符串,它有一個split方法,在那裏使用它。

在方括號之間的段的末尾,您有一個由'''分隔的元素列表(來自split),它們中的每一個都是由列表理解創建的列表中的條目。 。

該列表理解的結果,然後再迭代,在「爲我在[]」

4

改變極其嚴重命名ifields後,原來的代碼就相當於:

file_handle = open('a.txt') # open the file 
for line in file_handle: # iterate over lines in the file 
    fields = line.split('"') # split line into fields 
    # === End of equivalent code === 
    # Now do something with fields, for example: 
    for field in fields: 
     # Now do something with field 

以原始代碼的方式使用列表理解是混淆的效率低下。如上面的等效代碼所示,根本不需要列表理解。原始代碼構建了一個臨時列表,該列表立即迭代並最終丟棄,可能在長時間佔用大量內存之後。

注意:目前接受的答案不正確。 (1)原始代碼一次不會產生字段/標記;每個i將指代列表的字段(2)字段不是被換行符分隔;實際上每一行的最後一個字段(除了最後一行)都包含換行符。見下文。

如果輸入文件是:

ab"cdef"g 
h"ijk"lmno"p 
q 

那麼我的「價值」將是

['ab', 'cdef', 'g\n'] 
['h', 'ijk', 'lmno', 'p\n'] 
['q\n'] 

旁白:用雙引號分隔的有田是相當不尋常的,不是嗎?