我嘗試使用python來處理文本替換問題。有一個Little-endian UTF-16格式的文件,我想替換這個文件中的ip地址。首先,我按行讀取該文件,然後替換目標字符串,最後,我將新字符串寫入文件。但使用多線程操作此文件時,該文件將會出現亂碼。這是我的代碼。python多線程處理文件與fcntl flcok
import re
import codecs
import time
import thread
import fcntl
ip = "10.200.0.1"
searchText = r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
def replaceFileText(fileName,searchText,replaceText,encoding):
lines = []
with codecs.open(fileName,"r",encoding) as file:
fcntl.flock(file,fcntl.LOCK_EX)
for line in file:
lines.append(re.sub(searchText,replaceText,line))
fcntl.flock(file,fcntl.LOCK_UN)
with codecs.open(fileName,"w",encoding) as file:
fcntl.flock(file,fcntl.LOCK_EX)
for line in lines:
file.write(line)
fcntl.flock(file,fcntl.LOCK_UN)
def start():
replaceFileText("rdpzhitong.rdp",searchText,ip,"utf-16-le")
thread.exit_thread()
def test(number):
for n in range(number):
thread.start_new_thread(start,())
time.sleep(1)
test(20)
我不明白爲什麼該文件是亂碼,我使用的fcntl羊羣保持讀/寫序,問題出在哪裏?
+1也就是說,fcntl處於進程級別,由進程中的所有線程共享,並且鎖定位於線程級別,與其他線程無關。這些鎖是否獨立於OS實現了python?也就是說,它們在任何操作系統(Windows,類Unix等)中的行爲是否相同? – lulyon
@lulyon,是的,或多或少。 'Lock'是一個python線程結構,可以在任何支持python的平臺上工作。 'fcntl'是一個UNIX-ism,[在Windows上的py上不可用](http://stackoverflow.com/q/1422368/132382)。 – pilcrow
謝謝,這是非常有幫助的。 – lulyon