2013-05-20 20 views
9

我有一個工作python腳本的事,但必須在Python 3string.lower在Python 3

例如已經改變,如果我想參數1轉換爲小寫:

import string 
print(string.lower(sys.argv[1])) 

它說那'module' object has no attribute 'lower' - 好吧,我明白了,string現在是一個模塊。

如果我刪除了導入,而且只寫了string.lower('FOO'),那就抱怨name 'string' is not defined

那麼將字符串轉換爲小寫字符的正確方法是什麼?

+0

是的,你的第二個例子中沒有'string'變量。那麼你想轉換什麼? – squiguy

+0

爲什麼不''sys.argv [1] .lower()'? –

+0

啊,我的錯。我沒有注意到我從谷歌搜索找到的文檔是版本2.7 – Axarydax

回答

11

您可以使用sys.argv[1].lower()

>>> "FOo".lower() 
'foo' 

lower()是字符串對象本身的方法。

string模塊在Python 3中已被更改,它不再包含與str對象有關的方法,它現在只包含下面提到的常量。

您也可以使用str.lower("Mystring")但這不必要,因爲您可以簡單地使用"Mystring".lower()

>>> import string # Python 3 
>>> dir(string) 
['ChainMap', 'Formatter', 'Template', '_TemplateMetaclass', '__builtins__', '__cached__', '__doc__', '__file__', '__initializing__', '__loader__', '__name__', '__package__', '_re', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace'] 
+0

或'str.lower(sys.argv [1])' – Elazar

+2

@Elazar儘管這種方法有效,並且對於方法如何工作很有啓發性,但這是一種糟糕的方式寫這個。 – delnan

+1

@delnan我同意 - 它只是更類似於有問題的原始代碼。 – Elazar

4

strstring

>>> str.lower("HELLO") 
'hello' 

因此原因你得到的name 'string' is not defined.錯誤是有當前存在範圍不變量稱爲string

+1

這可以作爲方法工作的結果,但它不是一個顯而易見的方法來調用一個方法(這將是''HELLO「.lower()')。 – delnan

+0

@delnan我同意,但它最接近OP的原始代碼,並直接回答他爲什麼'string.lower'沒有工作的問題。 – HennyH

+1

我不認爲它回答了這個問題,因爲'str.lower(「HELLO」)'既適用於Python 2.x也適用於Python 3.x,問題是爲什麼'string.lower(「 HELLO「)在3.x中不起作用。 –

3

面向對象正確的方法是:

'FOO'.lower() 

在您的例子:

print(sys.argv[1].lower()) 
+0

問題是*面向對象的方式*是否總是正確的;) – pepr

2

要增加,而有些人更喜歡面向對象的方式(調用STR對象的方法) ,有些人可能更喜歡舊的方式 - 與功能或操作員。這也取決於正在解決的問題。 (如果您不同意,請考慮例如約(1.5).__add__(3)。)

您可以輕鬆創建自己的(更簡單的)函數名稱,使其更具可讀性。你只需要考慮是否它對所有人都是可讀的(將來你和現在):

>>> lower = str.lower 
>>> lower('SoMe CaPiTaL LetTerS to Be LoWeRED') 
'some capital letters to be lowered'