文件操作

  文件操作一般分为三步:打开文件得到文件句柄并赋值给一个变量--->通过句柄对文件进行操作-->关闭文件

f=open(r'C:\Users\hesha\PycharmProjects\Sat_20171216\practice__file\a.txt','r',encoding='utf-8')
data=f.read()
f.close()
open()参数包括文件路径(r''代表原生路径),文件操作(如果为r则默认rt模式)和编码方式

  文件操作关键两点:字符编码和资源回收。我们可以使用with关键字来帮助我们管理上下文

with open('a.txt','r',encoding='utf-8') as f:
data=f.read() #读取所有内容
print(data)

文件打开方式

  文件句柄=open('文件路径',‘模式’)

  模式可以是以下方式以及他们之间的组合

character meaning
'r' open for reading(default)
'w' open for writing,truncating the file list
'a' open for writing,appending to the end of the file if it exist
'b' binary mode
't' text mode
'+' open a disk file for updating(reading and writing)
'U' universal newline mode(for backwards compatibility;should not be used in new code)

  r(rt):只读文本模式;w(wt):只写文本模式;a(at):只追加文本模式

  b模式:对于非文本文件,我们只能用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码方式,图片文件的jgp格式、视频文件的avi格式),以b模式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

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

  'x':只写模式

  ‘U’:表示在读取时,"U"表示在读取时,可以将\r \n \r\n自动转换成\n(与r或者r+模式同时使用)因为Windows系统的换行符为\r\n,Linux系统的换行符为\n,加上U则能自动把\r\n转换成\n

  'w'和'x'的区别:w为只写模式,不存在则创建,存在则清空内容;x为只写模式,不存在则创建,存在则报错

  'r+'与'w+'的区别:r+可读可写,若文件不存在,报错;w+可读可写,若文件不存在,创建

  'r+'与'a+'的区别:r+覆盖写,a+追加写

文件读写

  读文件:f.read(),f.readline(),f.readlines()

#read,realine和readlines用法
with open('a.txt','r',encoding='utf-8') as f:
data=f.read() #读取所有内容
print(data) with open('a.txt','r',encoding='utf-8') as f:
data1=f.readline() #读取文件每一行内容
print(data1,end='') #print()函数自带换行,使用end=''去掉换行
data2=f.readline()
print(data2)
data3=f.readline()
print(data3) with open('a.txt','r',encoding='utf-8') as f:
data=f.readlines() #读取文件每一行内容并存入列表
print(data)

  写文件:f.write(),f.writelines()

#'w'模式写文件:没有文件则创建文件,有文件则清空文件,t模式打开的只能写字符串
with open('b.txt','w',encoding='utf-8') as f:
f.write('111\n222\n333\n') #针对't'模式的写,需要添上换行符 with open('b.txt','wb') as f:
f.write('111\n222\n'.encode('utf-8')) #针对'b'模式的写,需要encode并添上换行符 with open('b.txt','w',encoding='utf-8') as f:
f.writelines(['hahahh\n','heiheihei\n','hehehe\n']) #通过列表或元祖的形式写入文件内容 #'a'模式追加写:文件不存在则创建文件,存在则打开文件后将光标移动到文件末尾进行追加写
with open('b.txt','a',encoding='utf-8') as f:
f.write('aaa\nbbb\n') with open('b.txt','r',encoding='utf-8') as f:
for line in f:
print(line,end='')

  'b'模式进行文件写操作时,需要将字符串转换成bytes类型

with open('b.txt','rb') as f:
print(f.read().decode('utf-8')) #将读取的内容编码为utf-8模式 with open('b.txt','wb') as f:
f.write('早'.encode('utf-8')) #将字符串转成bytes类型

文件修改

  修改方法一:将硬盘存放的文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘

import os
with open('info.txt','r',encoding='utf-8') as read_f,\
open('.info.txt.swap','w',encoding='utf-8') as write_f:
data=read_f.read() #全部读入内存,如果文件很大,会很卡
data=data.replace('a','A') #在内存中完成修改
write_f.write(data) #一次性写入新文件 os.remove('info.txt')
os.rename('.info.txt.swap','info.txt')

  修改方法二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

import os
with open('info.txt','r',encoding='utf-8') as read_f,\
open('.info.txt.swap','w',encoding='utf-8') as write_f:
for line in read_f:
if 'A' in line:
line=line.replace('A','a')
write_f.write(line)
os.remove('info.txt')
os.rename('.info.txt.swap','info.txt')

文件内光标的移动

  f.read(3)

  以'r'模式打开文件时,‘3’代表读取3个字符,以'b'模式打开文件时,‘3’代表读取3个字节

  seek(),tell(),truncate()都是以字节为单位

  seek(offset,whence):offset表示开始的偏移量,也就是代表需要移动偏移的字节数,whence给offset参数一个定义,表示从哪个位置开始偏移,0代表从文件开头算起,1代表从当前位置算起,2代表从文件末尾算起。其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

with open('a.txt','r',encoding='utf-8') as f:
data1=f.read()
print('==1==>',data1)
print(f.tell()) #光标在文件中的位置,只有一种情况是以字符的形式(文件以rt模式打开)
f.seek(6,0) #第二个参数有三种方式,必须在b模式下才可以用1和2模式 1:以当前位置参照 2:以末尾参照

  truncate是截断文件,所以文件的打开方式必须可写为r+或a或a+(不能用w或w+的方式打开,因为那样直接清空文件了)

练习

(1)利用b模式,编写一个cp工具,要求如下:

  既可以拷贝文本又可以拷贝视频,图片等文件;

  用户一旦参数错误,打印命令的正确方法,如usage:cp source_file target_file

  提示:可以用import sys,然后用sys.argv获取脚本后面的参数

#cp:注意文件大小和打开模式
import sys
#print(sys.argv)
if len(sys.argv) != 3:
print('usage:cp source_file target_file')
sys.exit() _,src_file,dst_file=sys.argv
with open(src_file,'rb') as read_f,\
open(dst_file,'wb') as write_f:
for line in read_f:
write_f.write(line)
write_f.flush()

(2)修改文件内容,把文件中的‘hello’都替换成'bye'

import os
with open('a.txt','r',encoding='utf-8') as read_f,\
open('.a.txt.swap','w',encoding='utf-8') as write_f:
for line in read_f:
if 'hello' in line:
line=line.replace('hello','bye')
write_f.write(line) os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')

(3)文件a.txt内容:每一行内容分别为商品,价钱,个数,并已空格分隔

  apple 10 3

  peach 8 4

  cherry 18 5

  orange 27 7

  求出本次购物花费的总钱数

sum=0
with open('a.txt','r',encoding='utf-8') as f:
for line in f:
line_l=line.split()
#print(line_l)
price=int(line_l[1])
num=int(line_l[2])
good_sum=price*num
sum+=good_sum
print('sum is %s'%sum)

  

第四章 Python之文件处理的更多相关文章

  1. [Python学习笔记][第四章Python字符串]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...

  2. [Python笔记][第四章Python正则表达式]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之正则表达式 正则表达式是字符串处理的有力工具和技术,正则表达式使用预定义的特定模式去匹配一类具有共同特征的字符串,主要用于字符串处理 ...

  3. 0003.5-20180422-自动化第四章-python基础学习笔记--脚本

    0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...

  4. 孤荷凌寒自学python第三十四天python的文件操作对file类的对象学习

     孤荷凌寒自学python第三十四天python的文件操作对file类的对象学习 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.close() 当一个file对象执行此方法时,将关闭当前 ...

  5. 《Python CookBook2》 第四章 Python技巧 对象拷贝 && 通过列表推导构建列表

    (先学第四章) 对象拷贝 任务: Python通常只是使用指向原对象的引用,并不是真正的拷贝. 解决方案: >>> a = [1,2,3] >>> import c ...

  6. Python 编程快速上手 第十四章 处理 CSV 文件和 JSON 数据

    前言 这一章分为两个部分,处理 CSV 格式的数据和处理 JSON 格式个数据. 处理 CSV 理解 csv csv 的每一行代表了电子表格中的每一行,每个逗号分开两个单元格csv 的内容全部为文本, ...

  7. 第3章 Python基础-文件操作&函数 文件操作 练习题

    一.利用b模式,编写一个cp工具,要求如下: 1. 既可以拷贝文本又可以拷贝视频,图片等文件 2. 用户一旦参数错误,打印命令的正确使用方法,如usage: cp source_file target ...

  8. LabWindows/CVI入门之第四章:库文件(转)

    按语: 在参考CVI参考书使用CVI生成动态库后,在另一工程中调用DLL ,编译通不过,后参考此文,豁然开朗. http://blog.sina.com.cn/s/blog_6373e9e60101b ...

  9. 《Python核心编程》 第四章 Python对象- 课后习题

    练习 4-1. Python对象.与所有Python对象有关的三个属性是什么?请简单的描述一下. 答:身份.类型和值: 身份:每一个对象都有一个唯一的身份标识自己,可以用id()得到.  类型:对象的 ...

随机推荐

  1. jQuery,您可以实现元素的淡入淡出效果。

    fadeIn() fadeOut() fadeToggle() fadeTo() jQuery fadeIn() 用于淡入已隐藏的元素 $("button").click(func ...

  2. VC++6.0进行数字图像处理的步骤以及遇到的问题

    1) 2) 3) 添加CDIB类时,如果没有你要选的那个类,可以先随便选个基类继承,然后自己在代码里把基类修改成要继承的,把一些消息映射的注释掉就可以了,这样的话在建立类向导里也可以找到新建的类. / ...

  3. SQL更新字段内容部分值

    UPDATE att_allSET attachment = REPLACE(attachment, 'pw/', '')WHERE (attachment LIKE 'pw/%')

  4. [luogu3627 APIO2009] 抢掠计划 (tarjan缩点+spfa最长路)

    传送门 Description Input 第一行包含两个整数 N.M.N 表示路口的个数,M 表示道路条数.接下来 M 行,每行两个整数,这两个整数都在 1 到 N 之间,第 i+1 行的两个整数表 ...

  5. 使用python脚本定时备份web网站

    #!/usr/bin/env python #-*- coding: utf-8 -*- import os import time # 备份的指定目录 source = ['/data/www/Ad ...

  6. Oracle里schema理解

    在Oracle中,一个用户就是一个Schema,表都是建立在Schema中的,也可以理解为每个用户拥有不同的表.一个用户想访问另外一个用户,也就是另外一个schema的表的时候,可以用 usernam ...

  7. [Beginning SharePoint Designer 2010]列表和库&内部内容类型

    本章概要: 1.SPS如何组织管理数据 2.如何创建列表和文档库 3.如何使用视图来过滤分类,分组列表和库 4.如何创建内容类型来应用一个定义好的结构到数据和文档中

  8. 【简单的案例分享,停机10分钟】10204升级CRS&DB的PSU至102044

    发现一个现象,AIX5.3+HACMP+10.2.0.4RAC+RAW的环境,执行五六年的数据库crsd.log都会报下面错误: ----------------------------------- ...

  9. 使用Handler在子线程中更新UI

    Android规定仅仅能在主线程中更新UI.假设在子线程中更新UI 的话会提演示样例如以下错误:Only the original thread that created a view hierach ...

  10. float类型和double类型的二进制存储

    在32位环境下, float占用32位,double占用64位, 目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算.这种结构是一种科学计数法,用符号.指数和  ...