python open 文件

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()的原因,否则函数将判断不出正确结果

你可能感兴趣的:(python open 文件)