open(file,'r')
模式 | 可做操作 | 若文件不存在 | 是否覆盖 |
---|---|---|---|
r | 只能读 | 报错 | - |
r+ | 可读可写 | 报错 | 是 |
w | 只能写 | 创建 | 是 |
w+ | 可读可写 | 创建 | 否,追加写 |
a | 只能写 | 创建 | 否,追加写 |
a+ | 可读可写 | 创建 | 否,追加写 |
1、有文件a.txt,内容为“abc”;如何将其内容改为“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 修改文件指定行的方法
·、用的方法比拟笨,将文件内容按行读入到一个列表中,修改指定行即给列表中元素赋值;修改完后,用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 字节
5、直接使用 f.write() 每次都会把后面的内容都修改掉
6、Python常见错误IndentationError: unexpected indent
https://www.jianshu.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))#保存时保存完整路径才能对其进行后续操作
print "dir:",obj
else:
file_list.append(os.path.join(path, obj))
注意:使用os.isdir()与os.isfile()时,参数必须是一个相对路径或者绝对路径,不能光是一个文件名或者目录名称,这也是上面示例代码中使用os.path.join()的原因,否则函数将判断不出正确结果