python:文件操作

知识点概括
                                                                                                                                                                               practice

 1.文件路径

绝对路径和相对路径

1) 绝对路径,从磁盘的根目录寻找 或者 从互联网上寻找一个路径。

确定文件一定在哪里时 可以用绝对。

2)相对路径(用的多). 相对于当前程序所在的文件夹 ../上一层文件夹。

大多数情况下用相对路径

 绝对路径:

1 f = open("e:/abc/里皮.txt", mode="r", encoding="gbk")
2 s = f.read()
3 print(s)
4 f.close()

  相对路径:

1 #同一文件夹下只写文件名即可, ../表示上一文件夹
2 f = open("你好", mode="r", encoding="UTF-8")
3 s = f.read()    #read()文件之后需要赋值给变量
4 print(s)
5 f.close() # 如果没有这句话, 你在下面的程序中如果删除这个文件. 就会报错

 文件的for循环

文件是可迭代对象可以用 for 循环  读取文件中全部内容:

1 #读取文件中全部内容
2 f = open("你好", mode="r", encoding="utf-8")
3 for line in f:  # 文件是一个可迭代对象
4     print(line.strip()) # 一行一行的处理数据

   也可以是如下两种方法:(不常用,因为一直在运行)

 1 f = open("你好", mode="r", encoding="utf-8")
 2 while 1:
 3     s = f.readline().strip() # 一次读一行
 4     if s!= "":
 5         print("内容是",s)
 6         
 7 f = open("你好", mode="r", encoding="utf-8")
 8 lst = f.readlines()   #会一直读取
 9 print(lst)
10 f.close()
View Code

  2. mode 用法和区别

  r  w  a  r+  w+  a+  rb  wb  ab  r+b  w+b  a+b

  1)r 只读     

          s=f.read( ) 读取的时所有内容          for line in f: 按行循环

       s=f.readline( )  读取一行的内容

       s=f.readlines( )   读取的内容会放入到列表中,一行表示一个元素

1 f=open('../text/ll',mode='r',encoding='UTF-8')
2 s=f.read()     #
3 print(s)
4 f.close()
5 
6 f=open('../text/ll',mode='r',encoding='UTF-8')
7 for line in f:   #
8     print(line.strip())
9 f.close()

    2) w 只写

    带 的,会清空原来的,如果文件不存在,会自动创建新的文件。 

1 f=open('你好.txt',mode='w',encoding='UTF-8')
2 f.write('jdijdi')  #第一次写入,会清空之前的内容
3 f.write('kkkkk')   #第二次写入,不会清空上条语句写入的内容
4 f.flush()   #刷新
5 f.close()  #关闭

   3)a  追加写入

    默认在结尾处追加,所有的写入换行,需要手动添加 “ \ n "换行符

1 f=open('你好.txt',mode='a',encoding='UTF-8')
2 f.write('jdijdi\n')
3 f.write('kkkkk')
4 f.flush()   #刷新
5 f.close()

   4)  rb  wb  ab  : 带b的处理的是非文本文件,用bytes来处理

          当mode中含有b时,不能给定encoding

1 #将图片从C盘移动到E盘  
2 f=open('c:/abc.jpg',mode='rb')  #这里不能写encoding
3 e=open('e:/abc.jpg',mode='wb')
4 for line in f:  #从f中循环,在e盘中写入
5     e.write(line)
6 f.close()
7 e.flush()
8 e.close()

    5)r+  (读写)  工作时常用  (最好用的读写同时存在的模式)

    读取时,默认光标在最前面,从头开始读

    无论光标在哪里,写入时都在结尾处,

    除非上来就写入,写在开头替换掉开头原来的内容

1 f=open('你好.txt',mode='r+')
2 s=f.read(3)  #读取了3个字符
3 f.write('世界')   #写在末尾
4 print(s)
5 
6 f=open('你好.txt',mode='r+')
7 f.write('世界')   #写在末尾
8 print(s)

    6)w+  (写读)

     带w的会清空文件中的之前的内容,因此很少用

# 很少用. 因为会清空文件中的内容
f = open("阿西吧", mode="w+", encoding="utf-8")
f.write("张云雷也要退出德云社") # 写完之后光标在最后. 读取是没有内容的
f.seek(0) # 移动光标, 移动到开头
s = f.read()
print("读取的内容是",s)  #读取的内容为空,光标后没有东西
f.flush()
f.close()

   7)a+   追加 写/读  

    光标默认在最后

1 # a+
2 f = open("你好", mode="a+", encoding="utf-8")
3 f.write("我要加入德云社")  #在结尾处写入
4 f.seek(0)    #光标移动到开头
5 s = f.read()   #从开头读取内容
6 print(s)    #打印所有内容
7 f.flush()   #刷新
8 f.close()

 3.相关操作

  1) 光标  f.seek()
     开头:f.seek(0) 结尾:f.seek(0,2)
 
1 #常用的 开头结尾  css中常用
2 f.seek(0)  #开头   偏移量是0
3 f.seek(0,2)  #结尾  偏移量是0 
#  光标位置
f.seek(3)     #等于f.seek(3,0) 在开头处偏移量是3个字节即一个字符
f.seek(3,1)   #在当前位置偏移量是3
f.seek(3,2)   #在结尾处的偏移量是3 
1 #  反复读取
2 f=open('你好.txt',mode='r',encoding='utf-8')
3 for line in f:
4     print(line.strip())
5 f.seek(0)  #光标移动到开头
6 for line in f:
7     print(line.strip())
8 f.close()

   2)查询光标位置   f.tell( )    返回的时seek值 即字节 

1 f = open("啊同类个同同同", mode="w", encoding="utf-8")
2 f.write("哇哈哈哈哈压缩盖伦")
3 f.seek(9)
4 print(f.tell())   #9
1 f = open("你好", mode="r", encoding="utf-8")
2 f.seek(3) # 3byte => 1中文
3 s = f.read(1) # 读取一个字符
4 print(f.tell()) # 光标在哪儿???  如果文件中为汉字 输出为6
5 f.close()

 

   3)截断文件   truncate( )

  truncate() 截断文件
   默认从文件开头截断到光标位置 删除光标后面的内容
  truncate(12) 默认从文件开头截断到参数位置 删除后面的内容
1 # 从文件开头截断到光标位置
2 # 如果给参数. 从头截断到参数位置
3 f = open("你好", mode="w", encoding="utf-8")
4 f.write("哇哈哈哈哈压缩盖伦")
5 f.seek(9)
6 print(f.tell())
7 f.truncate(12)
8 f.close()

 

 4.修改操作  

    将日志文件存储为列表形式的记录

ID,name,phone,car
1,alex,10086,特斯拉 2,wusir,10010,劳动而扣分 3,taibai,10000,激动 4,ritian,12345,小黄车

 

 # 将以上给出的日志做成一条条记录存放在列表中
1
lis=[] 2 with open('20180806.log',mode='r',encoding='utf-8') as f: 3 first=f.readline().strip().split() #第一行放入列表中必须用readline() 4 for line in f: #循环文件的行 5 dic={} #用来存放每一行记录 6 ls=line.strip().split(',') #每一行进行切割 7 for i in range(len(first)): 8 dic[first[i]] = ls[i] 9 lis.append(dic) 10 print(lis)

 

5.修改文件

  步骤:1. 引入os模块  import os

          2. 打开目标文件, r
          3. 打开文件副本, w
          4. 从r中读取内容进行修改. 写入到副本中
          5. 删除源文件
          6. 重命名副本
1 import os
2 with open('你好',mode='r',encoding='utf-8') as f1, \
3     open('你好_副本',mode='w',encoding='utf-8') as f2:
4     for line in f1:
5         line=line.replace('alex','sba')
6         f2.write(line)
7 os.remove('你好')
8 os.rename('你好_副本','你好')

 

posted @ 2018-08-06 15:51  葡萄想柠檬  Views(238)  Comments(0)    收藏  举报
目录代码