文件操作

一般步骤1. 文件打开 2. 文件操作 3. 文件关闭

1. 打开文件

使用open(文件名(绝对路径), 打开模式, 编码)

文件打开的模式有:

r:  只读模式(默认)

w: 只写模式 (不可读,文件不存在就创建,存在则清空)

x:  只写模式 (不可读,文件不存在就创建,存在则报错)

a:  追加模式 (不可读,如果文件不存在就创建,如果存在则在原文件后面追加)

以上都是以字符串方式打开

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

'b' 表示以字节的方式操作 -> 后续socket部分会用到

文件的打开方式有 普通打开方式 和 二进制打开方式

普通打开:python内部将0101自动转换成字符串

二进制打开:'b'模式加str - bytes 转换 + 手动encoding='utf-8'

 # 打开一个文件使用open(文件名(绝对路径),打开模式,编码)
# 文件打开默认只读模式('r')
#
f = open('test.log', 'r')
data = f.read()
f.close()
print(data) f = open('test.log', 'r')
data = f.write('ehhh')
f.close()
print(data)
# 在只读状态下写入,报错 Traceback (most recent call last):
# File "D:/NaomiPyer/naomi_01/mod8/file_stuff.py", line 21, in <module>
# data = f.write('ehhh')
# io.UnsupportedOperation: not writable # 只写 - 文件不可读,只写情况下,文件不存在则创建,存在则清空内容写入
f = open('test1.log', 'w')
f.write('ruby')
f.close()
# 执行后自动创建了有'ruby'内容的文件
f = open('test1.log', 'w')
f.write('python')
f.close()
# 修改写入内容再次执行,文件内容更新为新输入的内容
f = open('test1.log', 'w')
f.read()
# 报错, 不可读 => io.UnsupportedOperation: not readable # x 只写 - 不可读,不存在则创建,存在则报错
f = open('test1.log', 'x')
f.write(' ')
f.close()
# 文件已存在,报错 => FileExistsError: [Errno 17] File exists: 'test1.log' # a 追加 - 不可读,不存在则创建,存在则只追加内容
f = open('test.log', 'a')
f.write('java')
f.close()
# 'test.log'文件里面追加了java 内容 # 以上为文件的基本打开方式
# 通常读取到的文件数据,类型是str, 如果要转换为字节,可以用types()
f = open('test.log', 'r')
data = f.read()
a = bytes(data, encoding='utf-8')
print(a)
# 这样文件里的数据就以bytes输出了 => b'zen of pythonjava' # 以字节方式打开
# 1. 只读
f = open('test.log', 'rb')
data = f.read()
print(data)
str_data = str(data, encoding='utf-8')
print(str_data)
# 不需要编码 # 2. 只写
f = open('test.log', 'wb')
f.write(bytes('牛奶', encoding='utf-8'))
f.close()
# 写入的字符串"牛奶"需要用编码变为bytes写入
f = open('test1.log', 'wb')
str_data = '牛奶'
bytes_data = bytes(str_data, encoding='utf-8')
f.write(bytes_data)
f.close()
# 以字节的方式写入

'+'

r+ 读写

 # r+
# w, 末尾追加,指针最后
f = open('test1.log', 'r+', encoding='utf-8') # 指针为0, 起始位置
print(f.tell()) data = f.read(3) # read(3) 读取3个字符(中文9个字节)
print(type(data), data)
print(f.tell())
# f.write('草莓')
# f.seek(0)
# data = f.read()
f.read(2)
print(f.tell())
print(type(data), data)
f.close()
# 指针 读取完数据,继续读取的时候从上次停下的位置开始继续读取
# 通过tell() 来获取指针
# 通过seek() 来调整指针 [seek以字节来说]
# 写入的时候,指针会调到最后

w+ 写读

 # w+,先清空,写完内容之后才可以读
# 写入完毕,指针到最后
f = open('test1.log', 'w+', encoding='utf-8')
data = f.read()
f.close()
print(data)
# 没有数据,因为写读是先写入再读取,没有写入的内容
f = open('test1.log', 'w+', encoding='utf-8')
f.write('鸡蛋')
data = f.read()
f.close()
print(data)
# 还是没有内容,因为写完之后指针已经到文件末尾
f = open('test1.log', 'w+', encoding='utf-8')
f.write('鸡蛋')
f.seek(0)
data = f.read()
f.close()
print(data)
# 写入数据后,调整指针到起始位置,读到文件内容

x+ 写读

基本和 w+ 一样,不同的是,如果文件已经存在,会报错。

a+ 写读

 # a+
# 写时追加,放到最后
f = open('test.log', 'a+', encoding='utf-8')
print(f.tell())
data = f.read()
print(data)
f.seek(0)
data = f.read()
print(data)
f.close()
# 因为a是追加,其实在打开文件的同时,指针已经到了文件末尾
# => 6 空 牛奶

几种读写方式共有的特点

 # 从开始向后读
# 写,追加,指针调到最后
f.tell() # 获取指针的位置
f.seek(num) # 调整指针的位置
data = f.read(1) # 读取一个字符(中文3个字节)
print(data)
print(f.tell()) # 向后移了三个字节
f.write('content') # 在尾部追加,并且指针移动到最后
f.close()

在不确定每个读写方式特点的时候,可以通过tell(), seek(), read(), write() 方法来判断

'b' 表示以字节的方式操作

wb w+b

rb r+b

xb x+b

ab a+b

上述是和在底层数据交流的时候,以字节的方式读写,默认以字节方式打开,拿到字节数据后转化为字符串进行操作,写入的时候同样转换为字节写入。

文件的操作:

 # close() 关闭一个文件

 # fileno() 文件描述符(后续讲)

 # flush() 文件内部缓冲区
# 写入内容之后,f.flush()可以将内存里写入的东西刷入到硬盘里 # read(1) 读取内容 # readable() 判断是否可读 # readline(1) 仅读取一行内容,再次执行会从第一次指针停下来的位置继续往下读取 # seek() 调整指针 # truncate() 截取, 依赖于指针 f = open("test.log", 'r', encoding='utf-8')
# f.read()
for line in f:
print(line)
# 效果同readline(),且比readline()更好用 # 关闭文件 close()
# 每次文件读写都要close(),比较麻烦,可以通过with语句来自动关闭
with open('test.log', 'r') as f:
f.read()
# 读取数据时,上面代码自动帮助close()文件
# python 2.7 及以后版本,可以同时还打开两个文件
with open('log1', 'r') as obj1, open('log2', 'r') as obj2:
pass
# 以读方式打开源文件,同时打开新文件w,可以一行一行读取然后一行一行写入新文件。大大节省了内存。
with open('源文件', 'r') as obj1, open('新文件', 'w') as obj2:
for line in obj1:
obj2.write(line)

文件关闭后不会保存指针,但是关闭前,文件读到哪儿,指针就指到哪儿。

如果需要记录文件读取的位置,我们可以将tell()指针位置先保存起来,下一次打开的时候seek()一下重新读取

【Python全栈笔记】05 [模块二] 19 Oct 文件的操作的更多相关文章

  1. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

  2. Python全栈开发【基础二】

    Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...

  3. Python全栈day 05

    Python全栈day 05 一.数据类型补充 1. int py2和py3的2种区别 py2有int和long,int的取值范围为-2^31~2^31-1,超出范围自动转为long,长整型. py2 ...

  4. Python全栈开发:模块

    模块,用一砣代码实现了某个功能的代码集合. 参考资源:http://www.cnblogs.com/alex3714/articles/5161349.html 类似于函数式编程和面向过程编程,函数式 ...

  5. Python全栈day21-22-23(模块)

    一,python的模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python ...

  6. Python全栈-day15-day16-常用模块

    1.time模块 1)时间戳 import time# 通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量 # 偏移量的是float类型 start_time = tim ...

  7. python 全栈开发,Day124(MongoDB初识,增删改查操作,数据类型,$关键字以及$修改器,"$"的奇妙用法,Array Object 的特殊操作,选取跳过排序,客户端操作)

    一.MongoDB初识 什么是MongoDB MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介 ...

  8. python全栈开发从入门到放弃之文件处理

    一.文件处理流程 1.打开文件,得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 事例文件内容 [一棵开花的树] 如何让你遇见我 在我最美丽的时刻 为这 我已在佛前求了五百年 求 ...

  9. 【Python全栈笔记】03 [模块二] 16-17 Oct 函数

    定义一个函数 def function_name(形式参数): 代码块 return 'Value' #如果没有写return,则默认返回None # 一个函数到return这一行就结束执行了,在re ...

随机推荐

  1. C#动态编译代码,执行一个代码片段,或者从指定文件中加载某个接口的实现类

    在项目进行中有时候会需要配置一些复杂的表达式,在程序运行的时候执行表达式,根据结果执行相应的操作,简单写了一个类Expression,利用.net的动态编译技术实现,代码如下: public clas ...

  2. 【解决】AWS服务控制台中上传文件失败

    使用IE 11,在 AWS Services Console 中不管是 S3 还是 Elastic Beanstalk 的页面中上传页面都会失败,提示信息如下: A problem occurred ...

  3. 【HOW】如何通过URL给Reporting Services报表传递参数

    [本地模式Reporting Services] 参见官方文档:http://msdn.microsoft.com/en-us/library/ms154042.aspx 示例:http://serv ...

  4. [转载]Vivado轻松实现IP封装

    Vivado轻松实现IP封装 1.新建一个测试工程 工程化的设计方法是离不开工程的,第一步往往都是新建工程,后面我会学习去工程化的开发方法,可能会更加高效. 2.利用向导完成IP封装 2.1.启动IP ...

  5. W5200移植W5500驱动教程

    说明,移植例程为我按照这个教程移植的例程,测试通过.工程模板为我经常使用的一个w5500模板,可以在里面直接添加文件编程.1. 将driver文件夹中W5500文件夹和所有.c文件复制到工程/sour ...

  6. C++设计模式-Decorator装饰模式

    Decorator装饰模式作用:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. UML图如下: Component是定义一个对象接口,可以给这些对象动态地添加职责. ...

  7. QT学习(打个广告)

    最近全面学习QT与c++,希望同行能够指教,于是打算建个群QQ群:85439482,欢迎大家,本群主要专注于QT皮肤库积累,软件架构以及标准c++学习.

  8. 【小错误】ORA-00265: instance recovery required, cannot set ARCHIVELOG mode

    1.错误描述:今天在起归档的时候报一下错误: SQL> alter database archivelog; alter database archivelog * ERROR at line ...

  9. oracle的over函数应用(转载)

    摘自: http://www.poluoluo.com/jzxy/201004/81921.html 百度文库也记载了Oracle中over()分析函数的用法 在泡坛子的时候中无意中发现了这个函数,才 ...

  10. java做的比较完善的FTP上传下载文件服务器源码

    Filename: ftp.java Author: leetsing(elove) Create date: 2004-08-30 Use: connect to FTP server,then u ...