4、文件操作

武sir:http://www.cnblogs.com/wupeiqi/articles/4943406.html

林海峰:http://www.cnblogs.com/linhaifeng/articles/5984922.html

4.1、文件处理流程

  1. 打开文件,得到文件句柄并赋值给一个变量
  2. 通过句柄对文件进行操作
  3. 关闭文件、把渔网回收--占用操作系统的资源
f = open('chenli.txt') #打开文件  python会默认按照系统编码打开文件:win:GBK,macos:UTF-8.
first_line = f.readline()
print('first line:',first_line) #读一行
print('我是分隔线'.center(50,'-'))
data = f.read()# 读取剩下的所有内容,文件大时不要用
print(data) #打印读取内容 f.close() #关闭文件

  4.2、打开文件例子

f=open('ha.log','r ')
#f.read() #把文件读出来
data=f.read() #接收文件内容
f.close()
print(data) >>>
hellodd
dsdsdasdsdsad

打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。

  4.3文件打开模式

文件句柄 = open('文件路径', '模式')
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。

模式大全:

  • r,只读模式【默认模式,文件必须存在,不存在则抛出异常】
  • w,只写模式。【不可读;不存在则创建;存在则删除内容;】
  • a,追加模式。【可读;   不存在则创建;存在则只追加内容;】

"+" 表示可以同时读写某个文件

  • r+,可读写文件。【可读;可写;可追加】
  • w+,写读
  • a+,同a

"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)

  • rU
  • r+U

"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

  • rb
  • wb
  • ab

4.4、代码例子-

一、基本打开操作

①、只读模式

#只读模式:r  也是默认模式

f=open('ha.log','r')
data=f.read()
print(data) >>>
dsdsdssdsdadalaixiaoyun

②'w'只写模式

#、只写模式'w'  如果文件不存在,就创建一个新文件.存在则清空内容。不可读!

f=open('ha.log','w')
f.write('dsdsdssdsdadalaixiaoyun') # data=f.read() #不可读
# print(data)
# f.close() f=open('laixioa.log','w')
f.write('sdsds')
f.close()

③'x模式' 只写模式,不存在的话自动创建。对于已经创建的文件,则会报错

# 'x'模式python3x新加的内容。只写模式,存在则报错,不存在则创建。

f=open('laixiaoyun.log','x')
f.write('sdsdsdsd')
Traceback (most recent call last):
File "/Users/laixiaoyun/PycharmProjects/untitled1/day17/文件操作-武sir.py", line 41, in <module>
f=open('laixiaoyun.log','x')
FileExistsError: [Errno 17] File exists: 'laixiaoyun.log' Process finished with exit code 1

④、‘a’追加模式,可读;   不存在则创建;存在则只追加内容;

# 'x'模式python3x新加的内容。只写模式,存在则报错,不存在则创建。

f=open('laixiaoyun.log','a')
f.write('sdsdsdsd222')

二、字节模式打开文件

"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)。计算机本质上是以二进制形式打开,然后转化为字符串的形式。如果把模式后面加上‘b’。计算机读出来都就会以,字节形式打开。

  • rb  
  • wb
  • ab
#如果要以直接模式打开,需要自己进行转化
f=open('laixiaoyun.log','r')
data=f.read()
b=bytes(data,encoding='utf-8')
print(data)
print(type(data))
print(b)
print(type(b))

一、只读模式:rb

#python2.*  字节读取的时候先获得二进制数据,然后按照指定的编码转化为字符串 python3,可以指定"b"模式字节用二进制打开
f=open('laixiaoyun.log','r')
data=f.read()
# b=bytes(data,encoding='utf-8')
print(data)
print(type(data))
#print(b)
#print(type(b)) #python3 字节提供用二进制模式打开的操作.遇到"b"模式的时候,就不需要进行转化。 f=open('ha.log','rb',)
data=f.read()
print(data)
f.close()
print(type(data)) >>>
1laixiao22211111111
<class 'str'>
b'dsdsdssdsdadalaixiaoyun'
<class 'bytes'>

二、只写模式:wb

#2、只写

f=open('ha,log','ab')
f.write(bytes('有一个人的名字叫做赖晓云',encoding='utf-8') ) #不走系统转化路径,在写入之前需要自己转化为字节。
f.close()

总结:

一、文件打开方式

普通方式:

python内部将二进制(0101010001011111),转化为字符串(默认utf-8)

二进制方式:b模式.不经过python解释器,直接转化为二进制,写入!

读:

f=open('ha,log','rb')
#f.write(bytes('有一个人的名字叫做赖晓云',encoding='utf-8') ) #不走系统转化路径,在写入之前需要自己转化为字节。
print(f.read())
f.close() >>>>
b'\xe6\x9c\x89\xe4\xb8\x80\xe4\xb8\xaa\xe4\xba\xba\xe7\x9a\x84\xe5\x90\x8d\xe5\xad\x97\xe5\x8f\xab\xe5\x81\x9a\xe8\xb5\x96\n\xe6\x99\x93\xe4\xba\x91\xe6\x9c\x89\xe
str_data=str(data,encoding='utf-8') #通过字符串转化,把字节转化为字符串
print(type(str_data))

写:

f=open('ha,log','ab')  #追加模式,每一次运行就添加
f.write(bytes('有一个人的名字叫hhhjh做赖晓云',encoding='utf-8') ) #不走系统转化路径,在写入前,需要自己转化为字节。
# data=f.read()
# print(data)
f.close() >>>
有一个人的名字叫做赖晓云有一个人的名字叫hhhjh做赖晓云有一个人的名字叫hhhjh做赖晓云

模式转换

f=open('haa,log','rb',)
data=f.read()
print(data)
f.close()
print(type(data)) str_data=str(data,encoding='utf-8')
print(str_data)
print(type(str_data)) >>>>
b'\xe6\x9c\x89\xe4\xb8\x80\xe4\xb8\xaa\xe4\xba\xba\xe7\x9a\x84\xe5\x90\x8d\xe5\xad\x97\xe5\x8f\xabhhhjh\xe5\x81\x9a\xe8\xb5\x96\xe6\x99\x93\xe4\xba\x91\xe6\x9c\x89\xe4\xb8\x80\xe4\xb8\xaa\xe4\xba\xba\xe7\x9a\x84\xe5\x90\x8d\xe5\xad\x97\xe5\x8f\xabhhhjh\xe5\x81\x9a\xe8\xb5\x96\xe6\x99\x93\xe4\xba\x91'
<class 'bytes'>
有一个人的名字叫hhhjh做赖*云有一个人的名字叫hhhjh做赖*云
<class 'str'>

二、模式大全

正常模式:r/w/x/a  只模式  →写入都是字符串类型

r模式:rb/wb/xb/ab  →字节类型  未来学到:socket的时候,还会再次接触

“+”号:可读、可写。

#r+,可读写文件。【可读;可写;可追加】先进行写的时候:末尾追加。一打开光标在第一位 从头开始追加,光标停留在追加结束位置。

#w+,先清空。再写。并且指针在最后。从开始往后读!
#x+  和w+一样。只不过文件存在就会报错。
#a+  默认是追加模式。一打开,指针就调到最后。写的时候,默认指针也是在最后。

三、指针

f=open('laixiayun2.log','r+',encoding='utf-8')
print(f.tell()) #指针为0 起始位置
print(f.read(1))
print(f.tell())
f.write('赖晓云')
print(f.tell())
print(f.read()) f=open('laixiayun3.log','w+',encoding='utf-8')
print(f.tell()) #指针为0 起始位置
print(f.read(1))
print(f.tell())
f.write('赖晓云')
print(f.tell())
print(f.read()) #f.tell() 获取指针的位置。
#f.seek(num) 调整指针的位置。

四、file方法:

一、class file(object):

  • def close(self):关闭文件
  • def fileno(self):文件描述
  • def flush(self):刷新文件内部缓冲区
f=open('laixiayun2.log','r+',encoding='utf-8')
print(f.tell()) #指针为0 起始位置
print(f.read(1))
print(f.tell())
f.write('赖晓云')
f.flush() #主动把写的内容刷入硬盘。时时保存数据
a=input(">>>") #由于一直等待输入,进程为结束,所以写只在内存,没有存入硬盘。需要使用
print(f.tell())
print(f.read())
  • def isatty(self):判断文件是否是同意tty设备
  • def next(self):获取下一行数据,不存在,则报错
  • def read(self, size=None):读取指定字节数据

    默认方式打开:读取一个字符

    字节方式打开:读取一个字节

  • def readline(self, size=None):仅读取一行数据。每次指针放在末尾。下一次重新读取一行。
f=open('laixiaoyun23.log','r+')
print(f.tell())
data_line=f.readline()
print(data_line) >>>
0
我是22多22
f=open('chenli.txt','r')
print(f.readline()) #记录上一次读取的位置,.一共会读到两个‘\n’符号,:文件中自带换行、print自带的换行符号 所以:print(‘飒飒’,end='')去除了end的换行符号
print(f.readline()) 
print(f.readline()) >>> 正趣果上果 Interesting fruit fruit 词:郭婞

  • defreadlines(self, size=None):读取所有数据,并根据换行保存到一个列表中,一行为一个元素
f=open('chenli.txt','r')
print(f.readlines(),end='') ['正趣果上果\n', 'Interesting fruit fruit\n', '词:郭婞\n', '曲:陈粒\n', '编曲/混音/和声:燕池\n', '萧:吗子\n', 'Words: Guo 婞\n', 'Song: Chen tablets\n', 'Arrange / Mix /
  • def seek(self, offset, whence=None):指定文件中指针位置
f.seek(num)
  • def  tell(self):获取当前指针位置
  • deftruncate(self, size=None):截断数据,仅保留指定之前数据。会依赖于指针!
f=open('laixiaoyun23.log','r+')
print(f.tell())
print(f.seek(6))
f.truncate()
f.close()
>>
#文件内容剩余:我是
截取指针之前的内容
  • def write(self, p_str):写内容;如果文件存在,则会清空文件。文件不存在,则会新建

写的过程中,需要自己加上换行符

  !f.write(3)会出现报错。因为文件内部全部都是字符串。

f=open('chenli.txt','r')
f.write('2222\n')
f.write('dsadsadsd\n')
  • defwritelines(self, sequence_of_strings):将一个字符串列表写入文件

    可以用于文件的修改!!

  • defxreadlines(self):可用于逐行读取文件,非全部

必须记住:

文件操作基本的功能:

close、flush、read()、readline、seek、tell、truncate、write、

循环文件:

f=open('laixiaoyun23.log','r',encoding='utf-8')

for line in f:
print(line) #一行一行的读取:可以读出所有行 f.readline() #一行一行往下读取。不知道尽头!!

五、关闭:with关键字,

with open as :

  代码块

#好处,复制一个10G大小的文件。最笨的方法直接赋值。导致内存被撑爆!可以同时两个文件
#在打开新文件的同时,创建新文件。(打开不占用内存,读的过程才会占用内存)
#一行一行的读取,然后一行一行的存。可以解决问题。
#with结束后,同时关闭两个文件。等价于:obj1=open('源文件',),obj2=open(‘新文件’,‘w’)

with open('原文件','r') as obj1,open('新文件','w') as obj2:
for line in obj1:
print(line)
obj2.write(line)

六、文本处理

f.read()    一次性读取文件的所有内容

f.readline()  一次读取文件一行

f.readlines()  一次性读取文件所有内容,并且按照一行一个元素,形成一个大字典。把保存给变脸,可以实现迭代操作

我们通常是指处理的内容。Python 将文本文件的内容读入可以操作的字符串变量非常容易。

文件对象提供了三个“读”方法: .read()、.readline() 和 .readlines()。

每种方法可以接受一个变量以限制每次读取的数据量,但它们通常不使用变量。

.read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。然而 .read() 生成文件内容最直接的字符串表示,但对于连续的面向行的处理,它却是不必要的,并且如果文件大于可用内存,则不可能实现这种处理。

.readline() 和 .readlines() 非常相似。它们都在类似于以下的结构中使用:

src_f=open('chenli.txt')
data=src_f.readlines() #读成为一个列表
for i in data:
print(i,end='') >>>
正趣果上果
Interesting fruit fruit
词:郭婞
曲:陈粒
编曲/混音/和声:燕池
萧:吗子
Words: Guo 婞
Song: Chen tablets
Arrange / Mix / Harmony: Yan Chi
Xiao: Well
你佩桃木降妖剑
他会一招不要脸

七、文件修改

  文件本质上不能修改,只能通过新文件覆盖原文件,实现修改。

文件打开都是通过软件打开,从硬盘加载到内存中,在内存是可以对文件进行修改的。修改的时会把内容加载到一个新文件中。保存的时候,就会覆盖源文件,从而实现修改操作!

readlines和writelines  都城为一个列表,写的时候按照列表的数据类型来写,通过列表的索引和切片进而可以实现修改操作。

src_f=open('chenli.txt')
data=src_f.readlines() #读成为一个列表
print(data)
src_f.close() after_f=open('chenli_1','w')
after_f.writelines(data)
print(data[10]) >>>
['正趣果上果\n', 'Interesting fruit fruit\n', '词:郭婞\n', '曲:陈粒\n', '编曲/混音/和声:燕池\n', '萧:吗子\n', 'Words: Guo 婞\n'] 你佩桃木降妖剑

八、指针归零

  对于打开的文件,只要不关闭,指针就不会归零。

比如f.read(8)之后,在没有close之前。以后在:for循环,readline都会从上一次开始往下读。

对于处理文件增量,需要记录上一个位置的过程中。可以在关闭结束前,tell下光标的位置。下次打开后seek上一次光标的位置!

 

九、bytes-字节模式,以字节的方式来写文件。二进制。打开时不需要指定特定的编码。

f=open('chenli_1','rb')
print(f.readline()) >>>
b'\xe6\xad\xa3\xe8\xb6\xa3\xe6\x9e\x9c\xe4\xb8\x8a\xe6\x9e\x9c\n'

字符串转化为字节模式:

a='演讲'.encode('utf-8') 直接用字符串方法转化也是可以的!
a=bytes('赖晓云',encoding='UTF-8')

#字符串------编码:encode----字节
#字节--------解码:decode----字符串
print(a)
print(a.decode('utf-8')) >>>
b'\xe8\xb5\x96\xe6\x99\x93\xe4\xba\x91'
赖晓云

python学习-day18、文件处理、的更多相关文章

  1. python学习9—文件基本操作与高级操作

    python学习9—文件基本操作与高级操作 1. 文件基本操作 打开文件,获得文件句柄:f = open('filename',encoding='utf-8'),open会查询操作系统的编码方式,并 ...

  2. python学习总结---文件操作

    # 文件操作 ### 目录管理(os) - 示例 ```python # 执行系统命令 # 清屏 # os.system('cls') # 调出计算器 # os.system('calc') # 查看 ...

  3. [Python学习笔记]文件的读取写入

    文件与文件路径 路径合成 os.path.join() 在Windows上,路径中以倒斜杠作为文件夹之间的分隔符,Linux或OS X中则是正斜杠.如果想要程序正确运行于所有操作系统上,就必须要处理这 ...

  4. Python学习--13 文件I/O

    Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系 ...

  5. Python学习_06_文件、IO

    文件对象 python中的文件操作和c语言比较类似,包括一些缓冲.偏移量的方式. 文件对象可以通过open().file()两个内建方法创建,两个方法并没有什么不同,使用方法和c语言中的fopen() ...

  6. python学习笔记:文件操作和集合(转)

    转自:http://www.nnzhp.cn/article/16/ 这篇博客来说一下python对文件的操作. 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句 ...

  7. python学习——大文件分割与合并

    在平常的生活中,我们会遇到下面这样的情况: 你下载了一个比较大型的游戏(假设有10G),现在想跟你的同学一起玩,你需要把这个游戏拷贝给他. 然后现在有一个问题是文件太大(我们不考虑你有移动硬盘什么的情 ...

  8. python学习8 文件的操作

    本文拷贝了on testing 的<python之文件操作:文件的读写>,只做学习之用 python的文件读写通过 一.用open函数 二.对文件读写操作 三.读取文件位置定位 1. op ...

  9. Python学习笔记——文件写入和读取

    1.文件写入 #coding:utf-8 #!/usr/bin/env python 'makeTextPyhton.py -- create text file' import os ls = os ...

随机推荐

  1. (33)odoo中产品价格字段

    打开product.template 和 product.product 模型发现有很多关于价格描述的字段 product.template:        price        list_pri ...

  2. jQuery 获取checkbox 获取值

    //全选 $("[name='checkbox']").attr("checked",'true'); //取消全选 $("[name='checkb ...

  3. C++ 中 ZeroMemory、memset 危险需慎用

    使用C/C++编程时,常使用ZeroMemory.memset或 “={0}”来对结构体对象进行初始化或清零.然而这三种方式都有各自的特点,使用时需谨慎,否则容易出现严重错误,本人今日解决一个导致宕机 ...

  4. [转]CSS网页布局:div水平居中的各种方法

    http://jingyan.baidu.com/article/fa4125ac90a2a328ac70929e.html 在Web标准中的页面布局是使用Div配合CSS来实现的.这其中最常用到的就 ...

  5. 超实用的JavaScript技巧及最佳实践

    众所周知,JavaScript是一门非常流行的编程语言,开发者用它不仅可以开发出炫丽的Web程序,还可以用它来开发一些移动应用程序(如PhoneGap或Appcelerator),它还有一些服务端实现 ...

  6. PHP投票系统

    1.投票页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  7. INSTALL_FAILED_INSUFFICIENT_STORAGE

    现象:运行程序,进行安装时,ANDROID模拟器启动失败,在Eclipse的控制台里log显示如下错误信息     Installation error: INSTALL_FAILED_INSUFFI ...

  8. android 总结(样式)—跑马灯 button的点击效果 RadioGroup 实现滑动的效果 button 下面有阴影 卡片样式

    <Button android:layout_width="wrap_content" android:layout_height="wrap_content&qu ...

  9. leetcode 日记 3sumclosest java

    思路一为遍历: public int thirdSolution(int[] nums, int target) { int result = nums[0] + nums[1] + nums[2]; ...

  10. [计算机、网络相关历史]unix简史

    本文2001年由台湾“网络农夫”所写,其人生平不祥,此文受鸟哥大力推崇,两人应该相识.文章写得很不错,应该是查了很多资料整理而成的,美中不足的是好多语句不通顺,国考语文绝对不及格,哈哈. 0.我的准备 ...