专栏首页python3Python--6 文件操作

Python--6 文件操作

文件通常用于存储数据或应用系统的参数。Python 提供了 OS、 os.path、 shutil 等模块处理文件, 其中包括打开文件、 读写文件、 复制和删除文件等函数。

python文件操作基本流程:

1.打开文件,或者新建立一个文件

2.操作文件,如读/写数据

3.关闭文件

6.1 文件的常见操作

6.1.1 文件的打开与关闭

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

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

打开文件的模式有:

    • r ,只读模式【默认】
    • w,只写模式【不可读;不存在则创建;存在则清空内容;】
    • x, 只写模式【不可读;不存在则创建,存在则报错】
    • a, 追加模式【可读;   不存在则创建;存在则只追加内容;】

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

    • r+, 读写【可读,可写】
    • w+,写读【可读,可写】
    • x+ ,写读【可读,可写】
    • a+, 写读【可读,可写】

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

    • rb  或 r+b
    • wb 或 w+b
    • xb 或 w+b
    • ab 或 a+b

 注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型

<1>打开文件

在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件

open(文件名,访问模式)

示例如下:

f = open('test.txt', 'w')

<2>关闭文件

close( )

示例如下:

# 新建一个文件,文件名为:test.txt f = open('test.txt', 'w') # 关闭这个文件 f.close()

6.1.2 文件的读写

<1>写数据(write)

使用write()可以完成向文件写入数据

demo:

f = open('test.txt', 'w') f.write('hello world, i am here!') f.close()

注意:

    • 如果文件不存在那么创建,如果存在那么就先清空,然后写入数据

<2>读数据(read)

使用read(num)可以从文件中读取数据,num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据

demo:

f = open('test.txt', 'r') content = f.read(5) print(content) print("-"*30) content = f.read() print(content) f.close()

注意:

如果open是打开一个文件,那么可以不用写打开的模式,即只写 open('test.txt')

如果使用读了多次,那么后面读取的数据是从上次读完后的位置开始的

<3>读数据(readlines)

就像read没有参数时一样,readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素

#coding=utf-8 f = open('test.txt', 'r') content = f.readlines() print(type(content)) i=1 for temp in content:     print("%d:%s"%(i, temp))     i+=1 f.close()

<4>读数据(readline)

#coding=utf-8 f = open('test.txt', 'r') content = f.readline() print("1:%s"%content) content = f.readline() print("2:%s"%content) f.close()

  文件的遍历可以使用循环的方式:

#coding=utf-8

f = open('test.txt', 'r') for line in f: print(line) f.close()

示例:制作文件的备份

  任务描述

  • 输入文件的名字,然后程序自动完成对文件进行备份
# --*-- coding=utf-8 --*--

oldFileName = input("请输入要拷贝的文件名字:")

oldFile = open(oldFileName,'r')
# 如果打开文件if oldFile:

# 提取文件的后缀
fileFlagNum = oldFileName.rfind('.')
if fileFlagNum > 0:
    fileFlag = oldFileName[fileFlagNum:]

# 组织新的文件名字
newFileName = oldFileName[:fileFlagNum] + '[复件]' + fileFlag

# 创建新文件
newFile = open(newFileName, 'w')

# 把旧文件中的数据,一行一行的进行复制到新文件中
for lineContent in oldFile.readlines():
    newFile.write(lineContent)

# 关闭文件
oldFile.close()
newFile.close()

View Code

6.1.3 文件的随机读写

<1>获取当前读写的位置

在读写文件的过程中,如果想知道当前的位置,可以使用tell()来获取

# 打开一个已经存在的文件
f = open("test.txt", "r")
str = f.read(3)
print("读取的数据是 : ", str)

# 查找当前位置
position = f.tell()
print("当前文件位置 : ", position)

str = f.read(3)
print("读取的数据是 : ", str)

# 查找当前位置
position = f.tell()
print("当前文件位置 : ", position)

f.close()

View Code

<2>定位到某个位置

如果在读写文件的过程中,需要从另外一个位置进行操作的话,可以使用seek()

seek(offset, from)有2个参数

offset:偏移量

from:方向

0:表示文件开头

1:表示当前位置

2:表示文件末尾

demo:把位置设置为:从文件开头,偏移5个字节

# 打开一个已经存在的文件
f = open("test.txt", "r")
str = f.read(30)
print("读取的数据是 : ", str)

# 查找当前位置
position = f.tell()
print("当前文件位置 : ", position)

# 重新设置位置
f.seek(5,0)

# 查找当前位置
position = f.tell()
print("当前文件位置 : ", position)

f.close()

View Code

demo:把位置设置为:离文件末尾,3字节处

# 打开一个已经存在的文件
# f = open("test.txt", "r")
# 程序运行报错io.UnsupportedOperation: can't do nonzero cur-relative seeks
# 修改为:
f = open("test.txt", "rb")


# 查找当前位置
position = f.tell()
print("当前文件位置 : ", position)

# 重新设置位置
f.seek(-3,2)

# 读取到的数据为:文件最后3个字节数据
str = f.read().decode()

print("读取的数据是 : ", str)

f.close()

View Code

6.1.4 文件的重命名、删除

有些时候,需要对文件进行重命名、删除等一些操作,python的os模块中都有这么功能

<1>文件重命名

os模块中的rename()可以完成对文件的重命名操作

rename(需要修改的文件名, 新的文件名)

import os os.rename("毕业论文.txt", "毕业论文-最终版.txt")

<2>删除文件

os模块中的remove()可以完成对文件的删除操作

remove(待删除的文件名)

import os os.remove("毕业论文.txt")

6.2 文件夹的相关操作

实际开发中,有时需要用程序的方式对文件夹进行一定的操作,比如创建、删除等

就像对文件操作需要os模块一样,如果要操作文件夹,同样需要os模块

<1>创建文件夹

import os os.mkdir("张三")

<2>获取当前目录

import os os.getcwd()

<3>改变默认目录

import os os.chdir("../")

<4>获取目录列表

import os os.listdir("./")

<5>删除文件夹

import os os.rmdir("张三")

示例:应用【面试题】:批量修改文件名

源文件:

[root@rs1 renameDir]# ll 总用量 0 drwxr-xr-x 2 root root 6 9月 24 17:17 新三国-1.txt drwxr-xr-x 2 root root 6 9月 24 17:17 新三国-2.txt drwxr-xr-x 2 root root 6 9月 24 17:17 新三国-3.txt drwxr-xr-x 2 root root 6 9月 24 17:17 新三国-4.txt drwxr-xr-x 2 root root 6 9月 24 17:17 新三国-5.txt drwxr-xr-x 2 root root 6 9月 24 17:17 新三国-6.txt drwxr-xr-x 2 root root 6 9月 24 17:17 新三国-7.txt drwxr-xr-x 2 root root 6 9月 24 17:17 新三国-8.txt drwxr-xr-x 2 root root 6 9月 24 17:17 新三国-9.txt

修改后的文件:

[root@rs1 enameDir]# ll 总用量 0 drwxr-xr-x 2 root root 6 9月 24 17:17 [英皇出品]-新三国-1.txt drwxr-xr-x 2 root root 6 9月 24 17:17 [英皇出品]-新三国-2.txt drwxr-xr-x 2 root root 6 9月 24 17:17 [英皇出品]-新三国-3.txt drwxr-xr-x 2 root root 6 9月 24 17:17 [英皇出品]-新三国-4.txt drwxr-xr-x 2 root root 6 9月 24 17:17 [英皇出品]-新三国-5.txt drwxr-xr-x 2 root root 6 9月 24 17:17 [英皇出品]-新三国-6.txt drwxr-xr-x 2 root root 6 9月 24 17:17 [英皇出品]-新三国-7.txt drwxr-xr-x 2 root root 6 9月 24 17:17 [英皇出品]-新三国-8.txt drwxr-xr-x 2 root root 6 9月 24 17:17 [英皇出品]-新三国-9.txt

#coding=utf-8

# 批量在文件名前加前缀

import os

funFlag = 1 # 1表示添加标志  2表示删除标志

folderName = './renameDir/'

# 获取指定路径的所有文件名字
dirList = os.listdir(folderName)

# 遍历输出所有文件名字
for name in dirList:
    print name

    if funFlag == 1:
        newName = '[英皇出品]-' + name
    elif funFlag == 2:
        num = len('[英皇出品]-')
        newName = name[num:]
    print newName

    os.rename(folderName+name, folderName+newName)

View Code

6.3 文件内容的搜索和替换

文件内容的搜索和替换可以结合前面学习的字符串查找和替换来实现。例如,从 hello.txt 文件中查找字符串 “hello” ,并统计 “hello” 出现的次数。 hello.txt 文件如下所示。

1 hello world

3 hello hello China

下面这段代码从 hello.txt 中统计字符串 “hello” 的个数。

#文件的查找 import re f1 = open('hello.txt') count = 0 for s in f1.readlines():     li = re.findall('hello',s) if len(li) > 0:         count = count + li.count('hello') print("查找到"+ str(count) + "个hello") f1.close()

【代码说明】

口第 5行代码定义变量count,用于计算字符串 “hello” 出现的次数。

口第 6行代码每 次从文件 hello .txt中读取1行到变量。

口第7行代码调用re 模块的函数findall()查询变量s, 把查找的结果存储到列表li中。

口第8行代码, 如果列表中的元素个数大于0,则表示查找到字符串 “hello” 。

口第9行代码调用列 表的count()方法, 统计当前列表中 "hello"出现的次数。

口第10行代码输出结果:

下面这段代码把 hello .txt 中的字符串 “hello” 全部替换为 “hi” ,并把结果保持到文件hello2.txt中。

# 文件的替换 f1 = open("hello.txt") f2 = open("hello2.txt","w") for s in f1.readlines() :     f2.write(s.replace('hello','hi')) f1.close() f2.close()

第 5行代码 先使用replace()把变量s中的“hello”替换为“hl,然后把结果写入到hello2.txt

中。 文件 hello2.txt的内容如下所示。

管理上下文

为了避免打开文件后忘记关闭,可以通过管理上下文,即:

with open('log','r') as f:

...

如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。

在Python 2.7 及以后,with又支持同时对多个文件的上下文进行管理,即:

with open('log1') as obj1, open('log2') as obj2:

pass

作业:

文件test.txt中包含以下内容:

今年是2017年。

2017年你好。

2017年再见

1) 读取该文件,并输出所有内容。

2) 去掉文件内容中的换行。

3) 计算出文件的长度。

4 )使用欧冠2018替换 2017。

5 )创建另一个文件test2.txt, 写入本文件的内容。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python文件读写,以后就用with

    读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件...

    py3study
  • python 文件操作2

    Somehow, it seems the love I knew was always the most destructive kind

    py3study
  • python文件操作详解

    文件操作是编程中必不可少的,配置文件,数据存储都是对文件操作;按文件操作与格式主要内容如下图:

    py3study
  • 用scrapy爬虫抓取慕课网课程数据详细步骤

    关于如何安装scrapy框架,可以参考这篇文章 史上最完全Mac安装Scrapy指南 http://www.jianshu.com/p/a03aab073...

    机器学习AI算法工程
  • 瓜子二手车市场分析(Scrapy+Tableau)

    本文对瓜子网杭州二手车进行了爬取和简单分析,一方面是为了进一步熟练使用Python的Scrapy爬虫框架,另一方面是为了熟悉Tableau强大的数据可视化功能。

    luanhz
  • 5-15 bootcss 之 modal 以及 jquery ui 之datepicker 小记

      最近公司在用bootstrap和Jquery UI做项目,类似与OA的东西前两天碰到点问题,记录一下。希望读者不要在遇到和我一样的问题。

    _淡定_
  • Linux私房菜:vi与vim编辑器

    vim还支持同时打开多个文件,用于跨文件操作:vim file1 file2 file*

    happyJared
  • 晒下我的vim-看这货是IDE吗?

    今天在公司配了下vim,参考了同事的配置,搞了几个不错的插件,回到家里把环境统一下。上两个图,看看效果如何。 darkblue配色:

    the5fire
  • 分享我用Qt开发的应用程序【二】在Qt应用程序中使用字体图标fontawesome

    为了使用简单,需要先写一个单件类,头文件的代码如下: 其中静态方法Instance保证IconHelper的实例全局唯一 (注意构造函数已经私有化了) #if...

    liulun
  • Winforms 可能遇到的 1000 个问题 去掉最大化和最小化按钮使用系统的图标禁止用户修改窗口大小隐藏标题栏的图标

    如果需要去掉最大化和最小化按钮,只需要设置 MinimizeBox 或 MaximizeBox 为 false 请看下面代码

    林德熙

扫码关注云+社区

领取腾讯云代金券