2011年10月31日 星期一

read,seek

f.read(1) #read 1 byte


f.seek(pos,how=0)


# how =0 => start of the file => SEEK_SET
# how =1 => current position  => SEEK_CUR
# how =2 => end of the file   => SEEK_END


f.seek(0,os.SEEK_SET)#以檔案開頭為reference point 再從第零個指標開始算起
f.seek(1,os.SEEK_SET)#以檔案開頭為reference point 再從第一個指標開始算起
f.seek(1,os.SEEK_SET)#等價於"f.seek(1,0)"


f.tell()#顯示出當前指標位置


f.truncate([size])#
#把文件裁成規定的大小,默認的是裁到當前文件操作標記的位置。
(從游標位置以右的資料清除 且包括游標當前位置)。如果size比文件的大小還要大,依據系統的不同可能是不改變文件,也可能是用0把文件補到相應的大小,也可能是以一些隨機的內容加上去

額外的參考指令如下:



python:目錄與文件操作
os.listdir(dirname):列出dirname下的目錄和文件
os.getcwd():獲得當前工作目錄
os.curdir:返回但前目錄('.')
os.chdir(dirname):改變工作目錄到dirname
os.path.isdir(name):判斷name是不是一個目錄,name不是目錄就返回false
os.path.isfile(name):判斷name是不是一個文件,不存在name也返回false
os.path.exists(name):判斷是否存在文件或目錄name
os.path.getsize(name):獲得文件大小,如果name是目錄返回0L
os.path.abspath(name):獲得絕對路徑
os.path.normpath(path):規範path字符串形式
os.path.split(name):分割文件名與目錄(事實上,如果你完全使用目錄,它也會將最後一個目錄作爲文件名而分離,同時它不會判斷文件或目錄是否存在)
os.path.splitext():分離文件名與擴展名
os.path.join(path,name):連接目錄與文件名或目錄
os.path.basename(path):返迴文件名
os.path.dirname(path):返迴文件路徑
>>> import os
>>> os.getcwd()
'C:\\Python25'
>>> os.chdir(r'C:\temp')
>>> os.getcwd()
'C:\\temp'
>>> os.listdir('.')
['temp.txt', 'test.py', 'testdir', 'tt']
>>> os.listdir(os.curdir)
['temp.txt', 'test.py', 'testdir', 'tt']
>>> os.path.getsize('test.py')
38L
>>> os.path.isdir('tt')
True
>>> os.path.getsize('tt')
0L
>>> os.path.abspath('tt')
'c:\\temp\\tt'
>>> os.path.abspath('test.py')
'c:\\temp\\test.py'
>>> os.path.abspath('.')
'c:\\temp'
>>>
>>> os.path.split(r'.\tt')
('.', 'tt')
>>> os.path.split(r'c:\temp\test.py')
('c:\\temp', 'test.py')
>>> os.path.split(r'c:\temp\test.dpy')
('c:\\temp', 'test.dpy'

>>> os.path.splitext(r'c:\temp\test.py')
('c:\\temp\\test', '.py')
>>> os.path.splitext(r'c:\temp\tst.py')
('c:\\temp\\tst', '.py')
>>>
>>> os.path.basename(r'c:\temp\tst.py')
'tst.py'
>>> os.path.dirname(r'c:\temp\tst.py')
'c:\\temp'

#打開文件和進行寫操作
f=open('test.txt','w')
f.write('hello')
f.writelines(['hi','haha'])#多行輸入
f.close()
#append data
f=open('test.txt','a')
f.write('hello')
f.writelines(['hi','haha'])
f.close()
#連續寫入後會自動關閉
open('test.txt','a').write('11111\r\n')
#把result裏的元素依次填到open函數裏去
result={'hello','u'}
exec open('test.txt') in result
#
selected = []                  # temp list to hold matches
fp = open('test.txt')
for line in fp.readlines():    # Py2.2 -> "for line in fp:"
     selected.append(line)
del line                       # Cleanup transient variable
#
open('test.txt').readlines()
file在python是一個特殊的類型,它用於在python程序中對外部的文件進行操作。在python中一切都是對象,file也不例外,file有file的方法和屬性。下面先來看如何創建一個file對象:     * file(name[, mode[, buffering]])file()函數用於創建一個file對象,它有一個別名叫open(),可能更形象一些,它們是內置函數。來看看它的參數。它參數都是以字符串的形式傳遞的。name是文件的名字。
mode 是打開的模式,可選的值爲r w a U,分別代表讀(默認) 寫 添加支持各種換行符的模式。用w或a模式打開文件的話,如果文件不存在,那麼就自動創建。此外,用w模式打開一個已經存在的文件時,原有文件的內容會被清 空,因爲一開始文件的操作的標記是在文件的開頭的,這時候進行寫操作,無疑會把原有的內容給抹掉。由於歷史的原因,換行符在不同的系統中有不同模式,比如 在 unix中是一個\n,而在windows中是‘\r\n’,用U模式打開文件,就是支持所有的換行模式,也就說‘\r’ '\n' '\r\n'都可表示換行,會有一個tuple用來存貯這個文件中用到過的換行符。不過,雖說換行有多種模式,讀到python中統一用\n代替。在模式 字符的後面,還可以加上+ b t這兩種標識,分別表示可以對文件同時進行讀寫操作和用二進制模式、文本模式(默認)打開文件。
buffering如果爲0表示不進行緩衝;如果爲1表示進行“行緩衝“;如果是一個大於1的數表示緩衝區的大小,應該是以字節爲單位的。file對象有自己的屬性和方法。先來看看file的屬性。     * closed #標記文件是否已經關閉,由close()改寫
     * encoding #文件編碼
     * mode #打開模式
     * name #文件名
     * newlines #文件中用到的換行模式,是一個tuple
     * softspace #boolean型,一般爲0,據說用於print
file的讀寫方法:     * F.read([size]) #size爲讀取的長度,以byte爲單位
     * F.readline([size])
       #讀一行,如果定義了size,有可能返回的只是一行的一部分
     * F.readlines([size])
       #把文件每一行作爲一個list的一個成員,並返回這個list。其實它的內部是通過循環調用readline()來實現的。如果提供size參數,size是表示讀取內容的總長,也就是說可能只讀到文件的一部分。
     * F.write(str)
       #把str寫到文件中,write()並不會在str後加上一個換行符
     * F.writelines(seq)
       #把seq的內容全部寫到文件中。這個函數也只是忠實地寫入,不會在每行後面加上任何東西。file的其他方法:     * F.close()
       #關閉文件。python會在一個文件不用後自動關閉文件,不過這一功能沒有保證,最好還是養成自己關閉的習慣。如果一個文件在關閉後還對其進行操作會產生ValueError
     * F.flush()
       #把緩衝區的內容寫入硬盤
     * F.fileno()
       #返回一個長整型的”文件標籤“
     * F.isatty()
       #文件是否是一個終端設備文件(unix系統中的)
     * F.tell()
       #返迴文件操作標記的當前位置,以文件的開頭爲原點
     * F.next()
       #返回下一行,並將文件操作標記位移到下一行。把一個file用於for ... in file這樣的語句時,就是調用next()函數來實現遍歷的。
     * F.seek(offset[,whence])
       # 將文件打操作標記移到offset的位置。這個offset一般是相對於文件的開頭來計算的,一般爲正數。但如果提供了whence參數就不一定了, whence可以爲0表示從頭開始計算,1表示以當前位置爲原點計算。2表示以文件末尾爲原點進行計算。需要注意,如果文件以a或a+的模式打開,每次進 行寫操作時,文件操作標記會自動返回到文件末尾。
     * F.truncate([size])
       #把文件裁成規定的大小,默認的是裁到當前文件操作標記的位置。如果size比文件的大小還要大,依據系統的不同可能是不改變文件,也可能是用0把文件補到相應的大小,也可能是以一些隨機的內容加上去
文件創建操作
import os
if not os.path.exists(r'd:/URLS/'+name):
    os.makedirs(r'd:/URLS/'+name)   #創建文件
path=r'd:/URLS/'+name+'/'
try:
    os.remove( path+'url.txt')
    os.remove( path+'MalwareCallHome.txt')
except WindowsError:
    pass
Ini文件操作
#coding=utf-8
import ConfigParser
def writeConfig(filename):
    config = ConfigParser.ConfigParser()
    # set db
    section_name = 'db'
    config.add_section( section_name )
    config.set( section_name, 'dbname', 'MySQL')
    config.set( section_name, 'host', '127.0.0.1')
    config.set( section_name, 'port', '80')
    config.set( section_name, 'password', '123456')
    config.set( section_name, 'databasename', 'test')
   
    # set app
    section_name = 'app'
    config.add_section( section_name )
    config.set( section_name, 'loggerapp', '192.168.20.2')
    config.set( section_name, 'reportapp', '192.168.20.3')
   
    # write to file
    config.write( open(filename, 'a') )
   
def updateConfig(filename, section, **keyv):
    config = ConfigParser.ConfigParser()
    config.read(filename)
    print config.sections()
    for section in config.sections():
        print "[",section,"]"
        items = config.items(section)
        for item in items:
            print "\t",item[0]," = ",item[1]
    print config.has_option("dbname", "MySQL")
    print config.set("db", "dbname", "11")
    print "..............."
    for key in keyv:
        print "\t",key," = ", keyv[key]
    config.write( open(filename, 'r+') )
   
if __name__ == '__main__':
    file_name = 'test.ini'
    writeConfig(file_name)
    updateConfig(file_name, 'app', reportapp = '192.168.100.100')
    print "end__"
Python綫程鎖
# -*- coding: UTF-8 -*-
import thread
from time import sleep
lk = thread.allocate_lock()
g_FinishCount = 0
def loop(id):
    lk.acquire()  #申請鎖
    for i in range (0,4):
        print "Thread ",id," working"
        sleep(1)
    lk.release()  #釋放鎖
    global g_FinishCount
    g_FinishCount = g_FinishCount + 1
thread.start_new_thread(loop,(1,))
thread.start_new_thread(loop,(2,))
thread.start_new_thread(loop,(3,))
while g_FinishCount < 3:
    sleep(1)




沒有留言:

張貼留言