python对文件的独 *** 作有哪几种?请详细说明每种方法

python对文件的独 *** 作有哪几种?请详细说明每种方法,第1张

1.打开文件:

f=open(r'E:\PythonProjects\test7\a.txt',mode='rt',encoding='utf-8')

以上三个单引号内分别表示:要打开的文件的路径,mode为文件打开方式具体介绍在下文,encoding为文件的字符编码,一般默认为utf-8

2.读写文件:

data=f.read() # 读文件

f.write()# 写文件

3.关闭文件:

f.close()

4.为了简便,一般采用上下文的方法进行文件 *** 作,可不用关闭文件

with open('a.txt',mode='rt',encoding='utf-8') as f:

data=f.read()

print(data)

with open('a.txt',mode='wt',encoding='utf-8') as f:

f.write('hello world')

5.控制文件读写的 *** 作:

r:(默认模式):只读:以该模式打开文件时,若文件不存在则报错,若文件存在,则文件指针在文件开头,即从文件开头开始读文件

w:只写:以该模式打开文件时,若文件不存在则创建一个文件,如文件存在,则清空文件内容,文件指针移到开头

a:追加写:以该模式打开文件时,若文件不存在则创建一个文件,如文件存在,则将文件指针移到文件末尾,在文件末尾写入新的内容

6.控制文件读写内容的模式:(t 和 b都不能单独使用,必须与r,w,a结合使用)

t:(默认):无论读写都是以字符为单位,只能识别文本文件,必须要制定encoding

b:无论读写都是以字节为单位,可以识别所有文件,一定不能指定encoding

7.文件的拷贝

with open ('a.txt',mode='rb') as af,\

open('b.txt',mode='wb') as bf:

data=af.read

f.write(data)

执行程序后,打开文件,即可发现文件已成功拷贝,这里使用 b 而不是用 t 模式,是因为文件有多种格式

8.文件的修改:

文件的修改是在硬盘上实现文件的覆盖,相当于一个新的文件以旧的文件名来命名的文件的修改有俩种方式,分别适用于不同的情景

方式一(适用于容量小的文件):这种方式的原理是:创建一个新的文件,将旧文件的内容拷贝到新的文件中这样内存里就存在俩个文件,故不适用于容量大的文件,具体代码见下方 View

with open('a.txt',mode='rt',encoding='utf-8') as f:

data=f.read()

data_new=data.replace('yang', 'yv')

with open('b.txt',mode='wt',encoding='utf-8')as p:

p.write(data_new)

方式二(适用于容量大的文件):此方式的原理为:读取旧文件的一行内容,修改后写到临时文件中,循环往复直到写完,然后将源文件删除,将临时文件命名为源文件名.这种方式在内存中只存在2行文件,节省内存,可用于大文件

import os

with open('b.txt',mode='rt',encoding='utf-8') as f,\

open('.b.txt.swap',mode='wt',encoding='utf-8') as p:

for line in f:

p.write(line.replace('yv','yang'))

# 调用replace方法,将源文件中的'yv',换成'yang'

os.remove('b.txt')

os.rename('.b.txt.swap','b.txt')

9. 文件的阶段:truncate(n)

将文件中n个字节后内容全删了,当 n 不存在时,即删除文件全部内容

10.文件内指针的移动

f.seek(): 指针的移动是以字节为单位的

seek 有三种模式:

0:(默认模式) 指针在文件开头,只有在 0 模式可以在 t 模式下用,也可以在 b 模式下用,而 1 ,2 模式只能在 b 模式下使用

1:指针在当前位置

2:指针在文件末尾

以下为具体事例:

# 0

with open('a.txt',mode='rt',encoding='utf-8')as f:

f.seek(3,0)

print(f.tell()) # 指针当前位置

print(f.read()) # 从指针后读出所有内容

# 1 参照指针当前位置

with open('a.txt',mode='rb')as f:

f.read(2)

f.seek(4,1)

print(f.tell())

print(f.read().decode('utf-8'))

# 2 参照文件末尾

with open('a.txt',mode='rb')as f:

f.seek(-5,2)

print(f.tell())

print(f.read().decode('utf-8'))

当 seek处于 2 模式时,可以将文件中新加入的内容打印出来,具体代码如下:

# 另一个文件进行写 *** 作,写的代码如下:

with open('a.txt',mode='at',encoding='utf-8')as f:

f.write('hello world\n')

# 每在文件中写入新的内容,都打印出来,以下代码执行打印 *** 作:

import time

with open('a.txt',mode='rb')as f:

f.seek(0,2)

while True:

line=f.readline() # readline 可以读取没有内容的部分

# print(line.decode('utf-8'))

if len(line)==0:

time.sleep(0.1)

else:

print(line.decode('utf-8'))

第一步,获取本地帮助文档的路径

    打开终端,输入python -m pydoc -p 0,此时它会返回pydoc server ready at http://localhost:port/的信息。

第二步,找到本地帮助库

    按第一步的输出信息,打开网页“http://localhost:56348/”,然后就可以找到所需的库,然后打开链接,即可以查看库中所有的函数了。

在Python 中引用是非常简单的事情,这里需要清楚三个概念就可以了包、模块、类。类这个就不用说了。

模块对应的是一个.py 文件,那么module_name 就是这个文件去掉.py 之后的文件名,py 文件中可以直接定义一些变量、函数、类。

那么包我们可以看作一个包含__init__.py 和一系列.py 文件的文件夹,这样做的目的是为了区别包和普通字符串。

import module_name

from package_name import module_name

from package_name import *

那么如何import 时,python 解释器如何才能找到该模块放置的文件位置呢?python 寻找模块的优先级如下:

1、   当前文件目录

2、   环境变量PYTHONPATH

3、   sys.path(list 类型)

sys.path 是list 类型,我们可以通过insert(), append() 方法来增加模块导入的搜索路径,如:

import sys

path = “……” # 需要增加的路径

sys.path.insert(0, path)

在import模块时,该模块的顶层代码将会被执行一次。如果该模块被import多次,例如import A, import B.其中B模块本身也有import A,那么只在第一次被import的时候顶层代码会被执行。

模块能像包含函数定义一样,可包含一些可执行语句。这些可执行语句通常用来进行模块的初始化工作。这些语句只在模块第一次被导入时被执行。这非常重要,有些人以为这些语句会多次导入多次执行,其实不然。

模块在被导入执行时,python解释器为加快程序的启动速度,会在与模块文件同一目录下生成.pyc文件。我们知道python是解释性的脚本语言,而.pyc是经过编译后的字节码,这一工作会自动完成,而无需程序员手动执行。

什么时候你应该使用 from module import?

如果你要经常访问模块的属性和方法,且不想一遍又一遍地敲入模块名,使用 from module import。

如果你想要有选择地导入某些属性和方法,而不想要其它的,使用 from module import。

如果模块包含的属性和方法与你的某个模块同名,你必须使用 import module 来避免名字冲突。

除了这些情况,剩下的只是风格问题了,你会看到用两种方式编写的 Python 代码。

尽量少用 from module import * ,因为判定一个特殊的函数或属性是从哪来的有些困难,并且会造成调试和重构都更困难。  

其它要点:

在创建许许多多模块后,我们可能希望将某些功能相近的文件组织在同一文件夹下,这里就需要运用包的概念了。包对应于文件夹,使用包的方式跟模块也类似,唯一需要注意的是,当文件夹当作包使用时,文件夹需要包含__init__.py文件,主要是为了避免将文件夹名当作普通的字符串。__init__.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值,__all__是在from package-name import *这语句使用的,全部导出定义过的模块。

那么我们平常新建文件的时候,都是建一个.py文件(类似java,但是python不用建立类,是以模块为载体)至于怎样组织包就要功能需要了

在C/C++/Java中,main是程序执行的起点,Python中,也有类似的运行机制,但方式却截然不同:Python使用缩进对齐组织代码的执行,所有没有缩进的代码(非函数定义和类定义),都会在载入时自动执行,这些代码,可以认为是Python的main函数。

每个文件(模块)都可以任意写一些没有缩进的代码,并且在载入时自动执行,为了区分主执行文件还是被调用的文件,Python引入了一个变量__name__,当文件是被调用时,__name__的值为模块名,当文件被执行时,__name__为'__main__'。这个特性,为测试驱动开发提供了极好的支持,我们可以在每个模块中写上测试代码,这些测试代码仅当模块被Python直接执行时才会运行,代码和测试完美的结合在一起。

典型的Python文件结构:

python import模块方法

python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径。

下面将具体介绍几种常用情况:

(1)主程序与模块程序在同一目录下:

如下面程序结构:

`-- src

|-- mod1.py

`-- test1.py

若在程序test1.py中导入模块mod1, 则直接使用import mod1或from mod1 import *

(2)主程序所在目录是模块所在目录的父(或祖辈)目录

如下面程序结构:

`-- src

|-- mod1.py

|-- mod2

|   `-- mod2.py

`-- test1.py

若在程序test1.py中导入模块mod2, 需要在mod2文件夹中建立空文件__init__.py文件(也可以在该文件中自定义输出模块接口)然后使用 from mod2.mod2 import * 或import mod2.mod2.

(3)主程序导入上层目录中模块或其他目录(平级)下的模块

如下面程序结构:

`-- src

|-- mod1.py

|-- mod2

|   `-- mod2.py

|-- sub

|   `-- test2.py

`-- test1.py

若在程序test2.py中导入模块mod1和mod2。首先需要在mod2下建立__init__.py文件(同(2)),src下不必建立该文件。然后调用方式如下:

下面程序执行方式均在程序文件所在目录下执行,如test2.py是在cd sub之后执行python test2.py

而test1.py是在cd src之后执行python test1.py不保证在src目录下执行python sub/test2.py成功。

import sys

sys.path.append("..")

import mod1

import mod2.mod2

(4)从(3)可以看出,导入模块关键是能够根据


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12113808.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存