這是我第一次使用 Python,我在將條目匯入組合框的 csv 檔案方面遇到了一個小問題。本質上,任何超過一個詞的條目都被大括號括起來。我不確定為什么會發生這種情況,也不知道如何解決這個問題。任何人都可以幫我解釋這個問題(請用簡單的英語;))。我已經閱讀了一些關于字串和串聯的內容,但老實說這讓我感到困惑。
owner_var = tk.StringVar()
with open('C:/Users/Me/Desktop/Test/Sample.csv', encoding='utf-8-sig') as csv_file:
csv_reader = csv.reader(csv_file)
data = list(csv_reader)
owner_drop_down = ttk.Combobox(master, state='readonly', values=data, textvariable=owner_var, font="Verdana 12").place(x=750, y=300, height=30, width=280)
我的 CSV 讀起來像這樣
A 列
Danny
Peter
Max Smith
John Dent
Andrew
它的列印方式如下
Print [['Danny'], ['Peter'], ['Max Smith'], ['John Dent'], ['Andrew']]
但是我在輸出中得到的看起來像這樣
Danny
Peter
{Max Smith}
{John Dent}
Andrew
任何人都可以向我解釋發生了什么,我該如何解決這個問題?
uj5u.com熱心網友回復:
嘗試以下操作 - 代碼逐行讀取行并將它們收集到串列中。因為我們不需要第一行,所以我們跳過它 ( [1:])
with open('my.csv') as f:
words = [w.strip() for w in f.readlines()][1:]
print(words)
我的.csv
Column A
Danny
Peter
Max Smith
John Dent
Andrew
輸出
['Danny', 'Peter', 'Max Smith', 'John Dent', 'Andrew']
uj5u.com熱心網友回復:
如果您的 csv 檔案包含單列,您可以逐行閱讀。
data = []
with open(r"C:\Users\Me\Desktop\Test\Sample.csv") as file:
for line in file:
data.append(line)
print(data)
它會給你下一個輸出:
['Column A\n', 'Danny\n', 'Peter\n', 'Max Smith\n', 'John Dent\n', 'Andrew']
如您所見,此輸出有兩個問題:
- 不跳過 CSV 標頭;
- 每個字串(最后一個除外)都包含尾隨
\n.
引自以下檔案open():
打開檔案并回傳相應的檔案物件。
還有一個來自python 教程的讀取和寫入檔案部分:
要從檔案中讀取行,您可以遍歷檔案物件。這是記憶體效率高,速度快,并且代碼簡單。
由此我們可以假設檔案物件是一個迭代器。為了解決第一個問題,我們需要跳過檔案物件(迭代器)的第一項。我們可以使用內置函式next():
data = []
with open(r"C:\Users\Me\Desktop\Test\Sample.csv") as file:
next(file) # skip first line
for line in file:
data.append(line)
print(data)
它會給我們下一個輸出:
['Danny\n', 'Peter\n', 'Max Smith\n', 'John Dent\n', 'Andrew']
這個解決方案只有一個問題。來自next()檔案的參考:
如果給出默認值,則在迭代器耗盡時回傳,否則
StopIteration引發。
這意味著如果輸入檔案為空并且我們不會傳遞default引數,我們將得到一個例外。解決方案很明顯,只需添加default引數。
為了解決尾隨問題,\n我們可以應用str.rstrip(). 如果我們不向str.rstrip()它傳遞任何引數,它將洗掉所有空格。代碼:
data = []
with open(r"C:\Users\Me\Desktop\Test\Sample.csv") as file:
next(file, None) # added default value
for line in file:
data.append(line.rstrip()) # added str.rstrip()
print(data)
它會給我們正確的輸出:
['Danny', 'Peter', 'Max Smith', 'John Dent', 'Andrew']
您可以使用串列理解縮短此代碼:
with open(r"C:\Users\Me\Desktop\Test\Sample.csv") as file:
next(file, None)
data = [line.rstrip() for line in file]
print(data)
或者你可以做得更短:
with open(r"C:\Users\Me\Desktop\Test\Sample.csv") as file:
data = [line.rstrip() for line in next(file, True) and file]
print(data)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/337213.html
