pythonru
⑴ python文件中的詞
本文實例講述了Python3處理文件中每個詞的方法。分享給大家供大家參考。具體實現方法如下:
CreatedonDec21,2012
處理文件中的每個詞
@author:liury_lab
'''
importcodecs
the_file=codecs.open('d:/text.txt','rU','UTF-8')
forlineinthe_file:
forwordinline.split():
print(word,end="|")
the_file.close()
#若詞的定義有變,可使用正則表達式
#如詞被定義為數字字母,連字元或單引號構成的序列
importre
the_file=codecs.open('d:/text.txt','rU','UTF-8')
print()
print('************************************************************************')
re_word=re.compile('[w'-]+')
forlineinthe_file:
forwordinre_word.finditer(line):
print(word.group(0),end="|")
the_file.close()
#封裝成迭代器
defwords_of_file(file_path,line_to_words=str.split):
the_file=codecs.open('d:/text.txt','rU','UTF-8')
forlineinthe_file:
forwordinline_to_words(line):
yieldword
the_file.close()
print()
print('************************************************************************')
forwordinwords_of_file('d:/text.txt'):
print(word,end='|')
defwords_by_re(file_path,repattern='[w'-]+'):
the_file=codecs.open('d:/text.txt','rU','UTF-8')
re_word=re.compile('[w'-]+')
defline_to_words(line):
formoinre_word.finditer(line):
yieldmo.group(0)#原書為return,發現結果不對,改為yield
returnwords_of_file(file_path,line_to_words)
print()
print('************************************************************************')
forwordinwords_by_re('d:/text.txt'):
print(word,end='|')
希望能幫到你!
⑵ python一段小函數解釋
一般我們常見來的網址自後綴(suffix)是 cn,或者net,或者com,你說的就是域名的後綴列表
後面代碼就是用dot把域名分隔開,
比如www..com 被拆分成[ 『www','','com']
經過for循環後,到com的時候,進入if分支,而前面走的是else分支,所以可以看到sdomain的變化如下:
遇到www, sdomain包含['www']
遇到 sdomain被替換為['']
遇到com,走if分支,append,變成 ['','com']
然後join後就變成 .com
不過不知道這么些的理由,要是我,就用正則表達式,或者直接保留後面兩個部分
domain=url.split('.')
if domain[-1] in suffixs:
return string.join(domain[-2:],'.')
else:
return None #not valid domain
⑶ python怎麼讀取TXT
Python的文本處理是經常碰到的一個問題,Python的文本文件的內容讀取中,有三類方法:read()、readline()、readlines(),這三種方法各有利弊,下面逐一介紹其使用方法和利弊。
read():
read()是最簡單的一種方法,一次性讀取文件的所有內容放在一個大字元串中,即存在內存中
file_object = open('test.txt') //不要把open放在try中,以防止打開失敗,那麼就不用關閉了try:
file_context = file_object.read() //file_context是一個string,讀取完後,就失去了對test.txt的文件引用
# file_context = open(file).read().splitlines()
// file_context是一個list,每行文本內容是list中的一個元素finally:
file_object.close()//除了以上方法,也可用with、contextlib都可以打開文件,且自動關閉文件,//以防止打開的文件對象未關閉而佔用內存read()的利端:
方便、簡單
一次性獨讀出文件放在一個大字元串中,速度最快
read()的弊端:
文件過大的時候,佔用內存會過大
readline()逐行讀取文本,結果是一個list
with open(file) as f: line = f.readline() while line:
print line
line = f.readline()readline()的利端:
佔用內存小,逐行讀取
readline()的弊端:
由於是逐行讀取,速度比較慢
**readlines()一次性讀取文本的所有內容,結果是一個list
with open(file) as f: for line in f.readlines():
print line這種方法讀取的文本內容,每行文本末尾都會帶一個' '換行符 (可以使用L.rstrip(' ')去掉換行符)
readlines()的利端:
一次性讀取文本內容,速度比較快
readlines()的弊端:
隨著文本的增大,佔用內存會越來越多
- file_object = open('test.txt','rU')try:
- for line in file_object:
- do_somthing_with(line)//line帶" "finally:
- file_object.close()
readline():
readlines():
最簡單、最快速的逐行處理文本的方法:直接for循環文件對象
⑷ python for循環的問題
if shuru == 'Y' or shuru == 'y':
...
elif shuru == 'N' or shuru == 'n':
...
不能只if ... or 'xxx'
後面這個等於直接if一個字元串,直接判定為true.
⑸ Python定義函數的時候,加不加括弧一樣嗎 比如,class Ru(): 和class Ru:
def才是定義函數的關鍵字吧,
class是定義類的關鍵字。因為默認繼承object類,所以兩種一樣。如果要繼承別的類就需要括弧的。
⑹ Python3中反斜杠\n
由復r開頭引起的字元串就是聲明了後制面引號里的東西是原始字元串,在裡面放任何字元都表示該字元的原始含義。
這種方法在做網站設置和網站目錄結構的時候非常有用,使用了原始字元串就不需要轉義了。
如果把單引號前邊的r去掉的話就可以換行了
⑺ Python反斜杠小問題
原因很簡單。runoob只輸出runoob的原因是run[o]ob中的o並不是一個語法類型。
其次,ru oob中ru[ ]oob的 有一個換行的意思,所以結果是:
1-[ru
2-oob]
如果不想讓他換行,可以使用/。
類似於 (換行)的還有 (字元串制中)和 (這個還沒了解可以試驗一下)
都可以試試看看效果。
⑻ 如何用python在Windows系統下,生成UNIX格式文件
平時測試工作中,少不了製造測試數據。最近一個項目,我就需要製造一批可在UNIX下正確讀取的文件。為確保這批文件能從FTP下載成功,開發叮囑我:「文件中凡是遇到換行,換行符必須是UNIX下的LF,而不是Dos\Windows下的CRLF。」
換行,在普通文檔編輯中,就是按下「Enter」鍵。在編寫代碼時,就是在文件中寫入字元串」\n」。但用python命令w在文件寫入換行」\n」以後,由於是Windows系統的原故,會默認把」\n」實際保存為」\r\n」。
對於Windows下為何是」\r\n」,這里引用網上的解釋:因為Windows採用了傳統的英文打字機模式,它在換行時需分解成兩步——回車」\r」和換行」\n」。回車(carriage return,CR)是將小車退回至起點,相當於把游標從行尾切換到行首,換行(line feed,LF)是將小車切換到下一行,這樣的組合操作就完成了另起一行的目的。
我們首先確認Windows下的換行是否真的是CRLF:把文件用任意一款文本編輯器(以Notepad++為例)打開,在編輯器的菜單欄中,找到「視圖」菜單,點擊「顯示符號」,勾選「顯示所有字元」,就可以顯示換行符了。我們在下圖中可以看到,在Windows系統下,文件中的換行符確實是CRLF。
如何把CRLF變成LF呢?開發給出了一個解決方案。
Method A:
在Notepad++界面右下角,雙擊當前文件格式的描述:「Dos\Windows」,點擊彈框中的「轉換為UNIX格式」,最後保存文件。此時可以看到文件每行結尾都已經展示為「LF」了。
雖然整個轉換過程極為簡單,但要是有一大批這樣的文件需要一個個手動轉換,我不禁感慨光(xīn)陰(hǎo)虛(lèi)度,韶(bù)光(xiǎng)易(dòng)逝。
在表達抗議後,開發表示可以優化此方法,即使用文本編輯器的替換功能:
Method B:
使用Notepad++打開原文件,按下組合鍵Ctrl+F後,在彈框中選擇「替換」欄,在「查找目標」輸入框填寫「\r\n」,「替換為」輸入框填寫「\n」,「查找模式」選擇「擴展(\n\r\t\0\x...)」,點擊「替換所有打開文件」後,一一保存文件即可。
然而把所有的文件保存一遍,並不能提升測試的幸福感。我追求的是盡量減少重復而繁重的手工勞動,解放雙手,高效測試!類似這樣的能力瓶頸,從我進入測試行業開始,就不斷擠占著我的業余時間。為了更好的提高自己,系統地學習測試開發所必需的技能,我報名參加了吳老的測試開發培訓班。
截至目前,吳老已經授課兩個多月,我從無到有,學習了很多基本的python開發知識,也偶爾能接觸到一些巧妙的編程思維。正好這次的數據准備,給我提供了一個實踐的契機,讓我運用最近學習的文件操作知識,體驗了一次局部自動化的樂趣。
下面給大家分享一下我這次愉快的實踐內容,由於真實的測試數據略有復雜,這里就用簡單的兩行數字來舉個栗子。
首先按上課所講的內容,依葫蘆畫瓢,使用Notepad++創建文件並寫入文本內容:
1 #coding:utf-8(設定文件編碼格式)
2 import os
3 import time
4
5 #切換到創建文件目錄
6 os.chdir(r"C:\Study\Chestnuts\01data")
7
8 #新建創建文件函數
9 def create_file():
10
11 #構造文件名:以「年月日」為文件名的.dat文件
12 t=time.localtime()
13 file_name=time.strftime("%Y-%m-%d",t)+".dat"
14 #創建並打開文件
15 fp=open(file_name,'w+')
16 #寫入文件內容
17 fp.writelines("12345\n")
18 fp.writelines("67890\n")
19 #關閉文件
20 fp.close()
21
22 #調用函數
23 create_file()
如上圖所示,執行腳本就會生成一份原始文件,不過在兩行內容的末尾,換行符均顯示為CRLF,接下來就是轉換的工作了。
Method C:對原文件進行格式轉換
如果是對現有的文件進行處理,可以使用Notepad++再編寫一個轉換的腳本。參考網上的方法,使用rU方式讀取文件內容,使用wb方式寫入文件內容,如下圖所示:
1 #coding:utf-8
2 import os
3
4 #文件路徑准備
5 route=r"C:\Study\Chestnuts\01data"
6
7 #遍歷路徑下目錄,文件夾,文件
8 for root,dirs,files in os.walk(route):
9 #遍歷文件
10 for name in files:
11 #歸納文件名特徵
12 if name[-3:]=='dat':
13 #拼接文件名(目錄+文件名稱)
14 catalog=os.path.join(root,name)
15 #把所有行分割符替換為換行符\n返回.
16 fp=open(catalog,"rU+")
17 #讀取文件並保存
18 strings=fp.read()
19 fp.close()
20 #使用二進制寫文件
21 fp1=open(catalog,"wb")
22 fp1.seek(0)
23 fp1.write(strings)
24 fp1.flush()
25 fp1.close()
執行這個腳本,就能對現有文件格式進行轉換,得到換行符是LF的文件了。
結果是對了,但執行兩個腳本來生成一份最終文件,難免讓我覺得還不夠簡單。我分析了以上文件轉換的代碼,發現關鍵步驟是使用二進制(wb)方式寫入文件。
Method D:原文件使用二進制方式寫入
既然這樣,不如在一開始就使用二進制寫文件,一步到位!並且只需把源代碼中寫入方式(w)變成二進制寫入(wb)方式即可。你看,僅僅添加了一個字母,就省去了十幾行代碼,還達到了預期目標,可謂一舉多得!
#coding:utf-8(設定文件編碼格式)
import os
import time
#切換到創建文件目錄
os.chdir(r"C:\Study\Chestnuts\01data")
#新建創建文件函數
def create_file():
#構造文件名:以「年月日」為文件名的.dat文件
t=time.localtime()
file_name=time.strftime("%Y-%m-%d",t)+".dat"
#創建並打開文件
fp=open(file_name,'wb+')
#寫入文件內容
fp.writelines("12345\n")
fp.writelines("67890\n")
#關閉文件
fp.close()
#調用函數
create_file()
⑼ 為什麼 Python,Ruby 等語言棄用了自增運算符
在 Python 中,整數是一種不可變類型。在創建對象之後,其值就不能再被改變。
在 Java 或 C 等語言中, ++ 做的事情是讓這個變數的值 +1,比如 a = 1; a++,意思是將 a 原本的內存區域表示的值替換為原本的值 +1。而在 Python 中,一旦一個整數對象創建,其值就不能再被改變。所以,就無法實現 自增、自減 操作了。
---------------
更新一下吧,關於 i += 1 和 i = i + 1 究竟有什麼不一樣。在大多數情況下,你可以認為這兩種寫法是等價的。但是在實現上,還是有些許差異的,下面以整形變數 a 舉例,兩種寫法生成的位元組碼如下:
i += 1:
6 LOAD_FAST 0 (a)
9 LOAD_CONST 1 (1)
12 INPLACE_ADD
13 STORE_FAST 0 (a)
i = i + 1
6 LOAD_FAST 0 (a)
9 LOAD_CONST 1 (1)
12 BINARY_ADD
13 STORE_FAST 0 (a)
可以看到,在底層調用上還是不同的。反應到 Python 語言層面的實現上,__add__ 對應著 + 號運算,而 __iadd__ 對應著 += 運算。