我試圖將兩個陳述句放入同一個函式中。這是將 csv 檔案串列(所有不同的長度、頁眉、頁腳和列)匯入到一個 Excel 作業表以匯入資料庫的長查詢的一部分。我想設定可以呼叫的函式來簡化流程。
現在,如果我運行以下代碼,它就可以作業,我可以使用兩個引數:beginFile 和 endFile 來確定要匯入的資料的開始和結束。
beginning = 'eventID'
ending = 'The Line Listing is wrong'
beginFile = 0
endFile = 0
with open("testbooklet.csv") as myFile:
for num, line in enumerate(myFile, 1):
if beginning in line:
beginFile = num
with open("testbooklet.csv") as myFile:
for num, line in enumerate(myFile, 1):
if ending in line:
endFile = num
print(beginFile,endFile)
然而; 如果我把它放到一個函式中,那么我會收到兩個不同的錯誤訊息,這取決于我如何撰寫函式。對于第一個函式,錯誤訊息是AttributeError: 'function' object has no attribute 'endFile'.
beginning = 'eventID'
ending = 'The Line Listing is wrong'
beginFile = 0
endFile = 0
# Define Function to find the first and last file lines
def fileinfo(file_name):
global beginFile
global endFile
for num, line in enumerate(file_name, 1):
if beginning in line:
fileinfo.beginFile = num
# def endfileinfo(file_name):
for num, line in enumerate(file_name, 1):
if ending in line:
fileinfo.endFile = num
MyFile = open("testbooklet.csv")
fileinfo(MyFile)
print(fileinfo.beginFile, fileinfo.endFile)
對于這個函式,錯誤代碼是: NameError: name 'endFile' is not defined
beginning = 'eventID'
ending = 'The Line Listing is wrong'
beginFile = 0
endFile = 0
def fileinfo(file_name):
global beginFile
for num, line in enumerate(file_name, 1):
if beginning in line:
beginFile = num
global endFile
for num, line in enumerate(file_name, 1):
if ending in line:
endFile = num
MyFile = open("testbooklet.csv")
fileinfo(MyFile)
print(beginFile)
print(endFile)
這是我用于測驗的資料的簡化版本:

uj5u.com熱心網友回復:
不要使用被函式改變的全域變數。而是讓函式回傳您需要的任何內容,并一次性獲取這兩個資訊:
def fileinfo(file):
beginFile = None
endFile = None
for num, line in enumerate(file, 1):
if beginning in line:
beginFile = num
if ending in line:
endFile = num
break # No need to continue
return beginFile, endFile # return this information to caller
myFile = open("testbooklet.csv")
beginFile, endFile = fileinfo(myFile)
print(beginFile, endFile)
uj5u.com熱心網友回復:
不要使用兩個回圈。第一個是讀取所有檔案,所以第二個回圈沒有什么可讀取的。您可以file.seek(0)通過回傳開始來解決此問題,但在這種情況下沒有必要——只需在單個回圈中測驗兩個條件即可。
您還應該使用引數和回傳值而不是全域變數。
def fileinfo(file, beginning, ending):
beginFile = 0
endFile = 0
for num, line in enumerate(file, 1):
if beginning in line:
beginFile = num
if ending in line:
endFile = num
return beginFile, endFile
with open("testbooklet.csv") as MyFile:
begin, end = fileinfo(MyFile)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/364518.html
上一篇:PythonException:'TypeError:divmod()不支持的運算元型別:'NoneType'和'int''
