Python中文件的读写,定位,模块

文件操作介绍

文件的作用
大家应该听说过一句话:“好记性不如烂笔头”。
不仅人的大脑会遗忘事情,计算机也会如此,比如一个程序在运行过程中用了九牛二虎之力终于计算出了结果,试想一下如果不把这些数据存放起来,相比重启电脑之后,“哭都没地方哭了”
可见,在把数据存储起来有做么大的价值

使用文件的目的:

就是把一些存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力

文件的打开与关闭

打开文件

在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件
open(文件名,访问模式)
示例如下:

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

说明:

访问模式说明
r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
w打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
wb以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
r+打开一个文件用于读写。文件指针将会放在文件的开头。
w+打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
wb+以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

关闭文件

示例如下:

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

    # 关闭这个文件
    f.close()

制作文件的备份

任务描述
输入文件的名字,然后程序自动完成对文件进行备份
在这里插入图片描述
在这里插入图片描述
参考代码

# 提示输入文件
oldFileName = input("请输入要拷贝的文件名字:")
# 以读的方式打开文件
oldFile = open(oldFileName,'rb')
# 提取文件的后缀
fileFlagNum = oldFileName.rfind('.')
if fileFlagNum > 0:
    fileFlag = oldFileName[fileFlagNum:]
# 组织新的文件名字
newFileName = oldFileName[:fileFlagNum] + '[复件]' + fileFlag
# 创建新文件
newFile = open(newFileName, 'wb')
# 把旧文件中的数据,一行一行的进行复制到新文件中
for lineContent in oldFile.readlines():
    newFile.write(lineContent)
# 关闭文件
oldFile.close()
newFile.close()

文件的读写

写数据(write)

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

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

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

读数据(read)

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

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

注意:
如果open是打开一个文件,那么可以不用谢打开的模式,即只写 open(‘test.txt’)
如果使用读了多次,那么后面读取的数据是从上次读完后的位置开始的

读数据(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()

读数据(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()

文件的定位读写

获取当前读写的位置

在读写文件的过程中,如果想知道当前的位置,可以使用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()

定位到某个位置

如果在读写文件的过程中,需要从另外一个位置进行操作的话,可以使用seek()
seek(offset, from)有2个参数
offset:偏移量
from:方向
0:表示文件开头
1:表示当前位置
2:表示文件末尾

把位置设置为:从文件开头,偏移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()

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

    # 打开一个已经存在的文件
    f = open("test.txt", "r")

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

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

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

    f.close()

文件的相关操作

文件重命名

os模块中的rename()可以完成对文件的重命名操作
rename(需要修改的文件名, 新的文件名)

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

删除文件

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

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

创建文件夹

    import os
    os.getcwd()

获取当前目录

    import os
    os.getcwd()

改变默认目录

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

获取目录列表

    import os
    os.listdir("./")

删除文件夹

    import os
    os.rmdir("张三")

python中的包

有2个模块功能有些联系
在这里插入图片描述
所以将其放到同一个文件夹下
在这里插入图片描述
使用import 文件.模块 的方式导入
在这里插入图片描述
使用from 文件夹 import 模块 的方式导入
在这里插入图片描述
在msg文件夹下创建__init__.py文件
在这里插入图片描述
在__init__.py文件中写入
在这里插入图片描述
重新使用from 文件夹 import 模块 的方式导入
在这里插入图片描述
总结:
包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为__init__.py 文件,那么这个文件夹就称之为包
有效避免模块名称冲突问题,让应用组织结构更加清晰

init.py文件有什么用
init.py 控制着包的导入行为

init.py为空
仅仅是把这个包导入,不会导入包中的模块

all
在__init__.py文件中,定义一个__all__变量,它控制着 from 包名 import *时导入的模块

可以在__init__.py文件中编写内容
可以在这个文件中编写语句,当导入时,这些语句就会被执行

init.py文件
在这里插入图片描述
在这里插入图片描述
可以控制导入其他模块

目录结构
在这里插入图片描述
sendmsg.py 和 recvmsg.py文件中的内容
在这里插入图片描述
python2导入失败
在这里插入图片描述
python3导入成功,但是不能使用模块
在这里插入图片描述
在文件夹下创建一个文件
在这里插入图片描述
python2导入成功,但不能使用
在这里插入图片描述
python3导入成功,但不能使用
在这里插入图片描述
解决python2不能使用的方式
在这里插入图片描述
python2的解放方式对python3不生效
在这里插入图片描述
解决python3不能使用的方式
在这里插入图片描述

模块

Python中的模块

有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt函数,必须用语句#include <math.h>引入math.h这个头文件,否则是无法正常进行调用的。
那么在Python中,如果要引用一些其他的函数,该怎么处理呢?
在Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块。
说的通俗点:模块就好比是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块

import

在Python中用关键字import来引入某个模块,比如要引用模块math,就可以在文件最开始的地方用import math来引入。

import module1,mudule2...

当解释器遇到import语句,如果模块在当前的搜索路径就会被导入。
在调用math模块中的函数时,必须这样引用:

模块名.函数名

有时候我们只需要用到模块中的某个函数,只需要引入该函数即可,此时可以用下面方法实现:

from 模块名 import 函数名1,函数名2....

注意:
通过这种方式引入的时候,调用函数时只能给出函数名,不能给出模块名,但是当两个模块中含有相同名称函数的时候,后面一次引入会覆盖前一次引入。也就是说假如模块A中有函数function( ),在模块B中也有函数function( ),如果引入A中的function在先、B中的function在后,那么当调用function函数的时候,是去执行模块B中的function函数。
如果想一次性引入math中所有的东西,还可以通过from math import *来实现

from…import

Python的from语句让你从模块中导入一个指定的部分到当前命名空间中
语法如下:

from modname import name1[, name2[, ... nameN]]

例如,要导入模块fib的fibonacci函数,使用如下语句:

from fib import fibonacci

注意:不会把整个fib模块导入到当前的命名空间中,它只会将fib里的fibonacci单个引入

from … import *

把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:

from modname import *

注意:这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。

as

    In [1]: import time as tt
    
    In [2]: time.sleep(1)
    ---------------------------------------------------------------------------
    NameError                                 Traceback (most recent call last)
    <ipython-input-2-07a34f5b1e42> in <module>()
    ----> 1 time.sleep(1)
    NameError: name 'time' is not defined
    
    In [3]: 
    
    In [3]: 
    
    In [3]: tt.sleep(1)
    
    In [4]: 
    
    In [4]: 
    
    In [4]: from time import sleep as sp
    
    In [5]: sleep(1)
    ---------------------------------------------------------------------------
    NameError                                 Traceback (most recent call last)
    <ipython-input-5-82e5c2913b44> in <module>()
    ----> 1 sleep(1)

    NameError: name 'sleep' is not defined
    
    In [6]: 
    
    In [6]: 
    
    In [6]: sp(1)

    In [7]:

定位模块

当你导入一个模块,Python解析器对模块位置的搜索顺序是:
当前目录
如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/
模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。

模块发布

模块发布

mymodule目录结构体如下:
├── setup.py
├── suba
│ ├── aa.py
│ ├── bb.py
│ └── init.py
└── subb
├── cc.py
├── dd.py
└── init.py

编辑setup.py文件

py_modules需指明所需包含的py文件

from distutils.core import setup

setup(name="dongGe", version="1.0", description="dongGe's module", author="dongGe", py_modules=['suba.aa', 'suba.bb', 'subb.cc', 'subb.dd'])

构建模块

python setup.py build
构建后目录结构
├── build
│ └── lib.linux-i686-2.7
│ ├── suba
│ │ ├── aa.py
│ │ ├── bb.py
│ │ └── init.py
│ └── subb
│ ├── cc.py
│ ├── dd.py
│ └── init.py
├── setup.py
├── suba
│ ├── aa.py
│ ├── bb.py
│ └── init.py
└── subb
├── cc.py
├── dd.py
└── init.py

生成发布压缩包

python setup.py sdist
打包后,生成最终发布压缩包dongGe-1.0.tar.gz , 目录结构

├── build
│ └── lib.linux-i686-2.7
│ ├── suba
│ │ ├── aa.py
│ │ ├── bb.py
│ │ └── init.py
│ └── subb
│ ├── cc.py
│ ├── dd.py
│ └── init.py
├── dist
│ └── dongGe-1.0.tar.gz
├── MANIFEST
├── setup.py
├── suba
│ ├── aa.py
│ ├── bb.py
│ └── init.py
└── subb
├── cc.py
├── dd.py
└── init.py

模块安装、使用

安装的方式

找到模块的压缩包
解压
进入文件夹
执行命令python setup.py install

注意:如果在install的时候,执行目录安装,可以使用python setup.py install --prefix=安装路径

模块的引入

在程序中,使用from import 即可完成对安装的模块使用
from 模块名 import 模块名或者*

模块中的__all__

没有__all__

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

模块中有__all__

在这里插入图片描述
在这里插入图片描述
总结:如果一个文件中有__all__变量,那么也就意味着这个变量中的元素,不会被from xxx import *时导入

模块制作

定义自己的模块

在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字。比如有这样一个文件test.py,在test.py中定义了函数add
test.py

    def add(a,b):
        return a+b

调用自己定义的模块

那么在其他文件中就可以先import test,然后通过test.add(a,b)来调用了,当然也可以通过from test import add来引入
main.py

    import test

    result = test.add(11,22)
    print(result)

测试模块

在实际开中,当一个开发人员编写完一个模块后,为了让模块能够在项目中达到想要的效果,这个开发人员会自行在py文件中添加一些测试信息,例如:
test.py

    def add(a,b):
        return a+b

    # 用来进行测试
    ret = add(12,22)
    print('int test.py file,,,,12+22=%d'%ret)

如果此时,在其他py文件中引入了此文件的话,想想看,测试的那段代码是否也会执行呢!
main.py

    import test

    result = test.add(11,22)
    print(result)

至此,可发现test.py中的测试代码,应该是单独执行test.py文件时才应该执行的,不应该是其他的文件中引用而执行

为了解决这个问题,python在执行一个文件时有个变量__name__

直接运行此文件
在这里插入图片描述
在其他文件中import此文件
在这里插入图片描述
在这里插入图片描述
总结:可以根据__name__变量的结果能够判断出,是直接执行的python脚本还是被引入执行的,从而能够有选择性的执行测试代码
在这里插入图片描述

应用:批量修改文件名

运行过程演示

运行程序之前
在这里插入图片描述
运行程序之后
在这里插入图片描述

参考代码

    #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)
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值