open(file,'r')
模式 | 可做操作 | 若文件不存在 | 是否覆蓋 |
---|---|---|---|
r | 只能讀 | 報錯 | - |
r+ | 可讀可寫 | 報錯 | 是 |
w | 只能寫 | 創(chuàng)建 | 是 |
w+ | 可讀可寫 | 創(chuàng)建 | 否,追加寫 |
a | 只能寫 | 創(chuàng)建 | 否裸燎,追加寫 |
a+ | 可讀可寫 | 創(chuàng)建 | 否资昧,追加寫 |
1富玷、有文件a.txt嚎京,內(nèi)容為“abc”馆揉;如何將其內(nèi)容改為“123abc”业舍。
content = file.read()
file.close()
pos = content.find( "abc" )
if pos != -1:
content = content[:pos] + "123" + content[pos:]
file = open( "test.txt", "w" )
file.write( content )
file.close()
print "替換了"
2、代碼是項目中需要處理一個文件升酣,所以使用python去處理舷暮,還有另外一個方法就是使用notepad++的正則替換,這里就只是使用python腳本去處理了噩茄。
可以對比python與shell哪種簡便下面。
# coding: UTF-8 #設置編碼
ff = open('C:\\Users\\yangwj\\Desktop\\1.txt','w') #打開一個文件,可寫模式
with open('C:\\Users\\yangwj\\Desktop\\num.txt','r') as f: #打開一個文件只讀模式
line = f.readlines() #讀取文件中的每一行绩聘,放入line列表中
for line_list in line:
line_new =line_list.replace('\n','') #將換行符替換為空('')
line_new=line_new+r'|'+'\n' #行末尾加上"|",同時加上"\n"換行符
print(line_new)
ff.write(line_new) #寫入一個新文件中
為什么不直接替換呢沥割?要先換成空格再添加耗啦??
append() 方法用于在列表list末尾添加新的對象机杜。
二帜讲、python 修改文件指定行的方法
·、用的方法比擬笨椒拗,將文件內(nèi)容按行讀入到一個列表中似将,修改指定行即給列表中元素賦值;修改完后陡叠,用writelines將列表從新寫入文件玩郊。
#!/usr/bin/python
import sys,os
f=open('hi.txt','r+')
flist=f.readlines()
flist[4]='hi\n'
f=open('hi.txt','w+')
f.writelines(flist)
2、示例:在PATH開頭的這一行末尾添加/usr/local/mysql/bin
with open('/home/mysql/.bash_profile') as f:
lines=f.readlines()
with open('/home/mysql/.bash_profile','w') as w:
for l in lines:
if(l.startswith('PATH')):
w.write(l.replace(b'\n',b':/usr/local/mysql/bin\n'))
else:
w.write(l)
3枉阵、不管是txt文件還是xml文件還是其他的译红,都可以用這種方法來批量替換文件中字符串:
# -*- coding:utf-8 -*-
__author__ = 'ShawDa'
import glob
xmls = glob.glob('xml_files/*.xml')
for one_xml in xmls:
print(one_xml)
f = open(one_xml, 'r+', encoding='utf-8')
all_the_lines = f.readlines()
f.seek(0)
f.truncate()
for line in all_the_lines:
line = line.replace('dog', 'pig')
line = line.replace('cat', 'bike')
f.write(line)
f.close()
4、批量讀取txt兴溜,并在文件開頭和每一行末尾添加字符串 (沒看懂)
from PIL import Image
#file.txt中存的是我需要批量讀取的txt的絕對路徑
lines = open("file.txt").readlines()
for line in lines:
line = line.strip()#把每個絕對路徑最后的換行符去掉
jpg_name = line.replace(".txt",".jpg")
img = Image.open(jpg_name)
#print line
#打開每個txt進行操作
with open(line) as f:
f_lines = f.readlines()
for i in range(0,len(f_lines)):
f_lines[i] = "change_str" + f_lines[i].strip() +"change_str"+"\n"
with open(line,"w") as f2:
f2.writelines(f_lines)
with open(line,"r+") as f3:
content = f2.read()
f3.seek(0,0)
str_ = "Note\n"
f3.write(str_+content)
f.seek(0, 0)不可或缺侦厚,file.seek(off, whence=0)在文件中移動文件指針, 從 whence ( 0 代表文件其始, 1 代表當前位置, 2 代表文件末尾)偏移 off 字節(jié)
5、直接使用 f.write() 每次都會把后面的內(nèi)容都修改掉
6拙徽、Python常見錯誤IndentationError: unexpected indent
http://www.reibang.com/p/070a1e52fa6f
沒對齊
7刨沦、批量處理某一目錄下的文件
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import os
path = "/root/python.file/shouldadd/"
file_list = os.listdir(path)
for filename in file_list:
filename = os.path.join(path,filename)
with open(filename, 'r+') as f:
lines = f.readlines()
with open(filename , 'w') as w:
for l in lines:
if(l.startswith('# platform =')):
str1 = "Red Hat Enterprise Linux 7"
str2 = "Big Cloud Enterprise Linux 7"
if str1 in l and str2 not in l:
w.write(l.replace(b'\n',b',Big Cloud Enterprise Linux 7\n'))
else:
w.write(l)
else:
w.write(l)
os.path.listdir(path) 獲取的是目錄下的文件名
os.path.join() 需要把path 和文件名連接起來,才能正常讀取
for obj in objects:
if os.path.isdir(os.path.join(path, obj)):#判斷是否是目錄os.path.join()用來將路徑拼接
dir_list.append(os.path.join(path, obj))#保存時保存完整路徑才能對其進行后續(xù)操作
print "dir:",obj
else:
file_list.append(os.path.join(path, obj))
注意:使用os.isdir()與os.isfile()時膘怕,參數(shù)必須是一個相對路徑或者絕對路徑想诅,不能光是一個文件名或者目錄名稱,這也是上面示例代碼中使用os.path.join()的原因岛心,否則函數(shù)將判斷不出正確結(jié)果