2017-08-09 41 views
1

我在互聯網上發現了這段代碼,意在搜索壓縮文件夾中的文本文件以查找匹配項。我跑它空閒,看看它是如何工作的..但我有一個問題,它似乎是這一行:Python解釋器將變量定義爲tulpe時,它是一個字符串?

fname = seed + ".txt" 

錯誤消息返回此:

Traceback (most recent call last): 
File "C:/Users/[name]/AppData/Local/Programs/Python/Python36-32/zip2.py", line 10, in <module> 
fname = seed + ".txt" 
TypeError: can only concatenate tuple (not "str") to tuple 

下面是代碼:

import re 
from zipfile import * 
findnothing = re.compile(r"Next nothing is (\d+)").match 
comments = [] 
z = ZipFile("channel.zip", "r") 

seed = "90052" 

while True: 
    fname = seed + ".txt" 
    comments.append(z.getinfo(fname).comment) 
    guts = z.read(fname) 
    m = findnothing(guts.decode('utf-8')) 
    if m: 
     seed = m.groups(1) 
    else: 
     break 
print("".join(comments)) 

我已經搜索了stackoverflow,並沒有發現類似於我的問題。他們大多數認爲變量中的逗號通常會導致編譯器將其視爲一個元組。我不明白爲什麼它說種子是一個元組。沒有逗號,沒有括號,或其他任何可以將它定義爲Python編譯器的元組的東西。我怎樣才能解決這個問題?

在此先感謝

回答

1

更改m.groups(1)m.group(1)(單數,不是複數)。根據https://docs.python.org/3.6/library/re.html#re.match.groups的文檔,group返回單個匹配,但groups返回所有匹配的元組。您在循環中第二次收到錯誤時,seed已被輸出爲groups(它是一個元組)。

+1

感謝您的回覆並鏈接到文檔!我更改了代碼,並且在連接字符串時不再拋出錯誤。但是,最後我遇到了一個不同的錯誤,我自己也設法解決。我會把我的解決方案放在這裏,以防其他人遇到類似的情況。最後一行代碼返回「TypeError:序列項目0:期望的str實例,找到的字節」我通過將代碼更改爲「print(str(b」「。join(comments)))」來修復它「 – Marty

1

首先,re.match只在字符串的開頭匹配。確保你不是想用re.search代替!

二,m.groups(1)返回一個元組,如('12345',)。改爲嘗試seed = m.groups(1)[0]

+0

謝謝你的迴應!你說re.match只匹配字符串的開頭,並且確保我不是故意使用re.search,而是這個程序用來搜索的文本文件只有一行。對於這種情況,re.search仍然是更合適的選擇嗎? – Marty

相關問題