python初学2 python的文件操作方法 python中readline判断文件读取结束的方法 python 实时遍历日志文件

python中的文件对象:
文件对象不仅可以用来访问普通的磁盘文件, 而且也可以访问任何其它类型抽象层面上的"文
件". 一旦设置了合适的"钩子", 你就可以访问具有文件类型接口的其它对象, 就好像访问的是普
通文件一样.

文件内建函数[open()和 file()]

1 open('filename')
2 with open('filename') as f:
3         pass

open函数使用一个文件名作为唯一的强制参数,然后返回一个文件对象。模式和缓冲参数都是可选的,默认为只读模式打开文件。使用with即使发生错误可以关闭文件,
下面列出文件对象的访问的模式:

复制代码
 1 文件模式   操作
 2 r  以只读方式打开
 3 rU 或 Ua 以读方式打开, 同时提供通用换行符支持 (PEP 278)
 4 w  以写方式打开 (必要时清空)
 5 a  以追加模式打开 (从 EOF 开始, 必要时创建新文件)
 6 r+ 以读写模式打开
 7 w+ 以读写模式打开 (参见 w )
 8 a+ 以读写模式打开 (参见 a )
 9 rb 以二进制读模式打开
10 wb 以二进制写模式打开 (参见 w )
11 ab 以二进制追加模式打开 (参见 a )
12 rb+ 以二进制读写模式打开 (参见 r+ )
13 wb+ 以二进制读写模式打开 (参见 w+ )
14 ab+ 以二进制读写模式打开 (参见 a+ )
15 x    如果文件存在报错,不存在则创建
16 ***加b模式打开,不可以在指定encoding,切写入时也需要转换为字节写入文件
17 
18 下面是一些打开文件的例子:
19 f = open('/etc/motd') # 以读方式打开
20 f = open('test', 'w') # 以写方式打开
21 f = open('data', 'r+') # 以读写方式打开
22 f = open('io.sys', 'rb') # 以二进制读模式打开
23 
24 bytes 字符串转换字节类型
25 n=bytes(李杰,encoding='utf-8')[转换的字符,可以是变量,转换后的编码]
26 字节转换为字符串
27 str(bytes(李杰,encoding='utf-8'),encoding='utf-8)
28 文件操作
复制代码

open() 和 file() 函数具有相同的功能, 可以任意替换.任何使用 open() 的地方, 都可以使用 file() 替换它.建议使用 open() 来读写文件, 在处理文件对象时使用 file() 。open() 成功执行并返回一个文件对象之后, 所有对该文件的后续操作都将通过这个"句柄"进行.

文件方法可以分为四类: 输入, 输出, 文件内移动, 以及杂项操作. 
输入

read() 方法用来直接读取字节到字符串中, 最多读取给定数目个字节. 如果没有给定 size
参数(默认值为 -1)或者 size 值为负, 文件将被读取直至末尾.

指定读取size:

readline() 方法读取打开文件的一行(读取下个行结束符之前的所有字节). 然后整行,包括行
结束符,作为字符串返回. 和 read() 相同, 它也有一个可选的 size 参数, 默认为 -1, 代表读至
行结束符. 如果提供了该参数, 那么在超过 size 个字节后会返回不完整的行.

readlines() 方法并不像其它两个输入方法一样返回一个字符串. 它会读取所有(剩余的)行然
后把它们作为一个字符串列表返回. 它的可选参数 sizhint 代表返回的最大字节大小. 如果它大
于 0 , 那么返回的所有行应该大约有 sizhint 字节(可能稍微大于这个数字, 因为需要凑齐缓冲区
大小).

输出
write() 内建方法功能与 read() 和 readline() 相反. 它把含有文本数据或二进制数据块的
字符串写入到文件中去.

文件内移动
seek() 方法(类似 C 中的 fseek() 函数)可以在文件中移动文件指针到不同的位置. offset
字节代表相对于某个位置偏移量. 位置的默认值为 0 , 代表从文件开头算起(即绝对偏移量), 1 代
表从当前位置算起, 2 代表从文件末尾算起. 如果你是一个 C 程序员,并且使用过了 fseek() , 那
么,0, 1, 2 分别对应着常量 SEEK_SET, SEEK_CUR, 以及 SEEK_END. 当人们打开文件进行读写操
作的时候就会接触到 seek()方法。

#跳过前五个字符,读取之后的内容

truncate() 方法, 它接受一个可选的 size 作为参数. 如果给定, 那么文
件将被截取到最多 size 字节处. 如果没有传递 size 参数, 那么默认将截取到文件的当前位置.
例如, 你刚打开了一个文件, 然后立即调用 truncate() 方法, 那么你的文件(内容)实际上被删除,
这时候你是其实是从 0 字节开始截取的( tell() 将会返回这个数值 )

其他:

close() 
关闭文件来结束对它的访问. Python 垃圾收集机制也会在文件对象的引用计数降
至零的时候自动关闭文件. 这在文件只有一个引用时发生, 例如 f = open(...), 然后 f 在原文
件显式地关闭前被赋了另一个文件对象. 良好的编程习惯要求在重新赋另个文件对象前关闭这个文
件. 如果你不显式地关闭文件, 那么你可能丢失输出缓冲区的数据.

fileno() 方法返回打开文件的描述符. 这是一个整数, 可以用在如 os 模块( os.read() )的
一些底层操作上

flush() 方法会直接把内部缓冲区中的数据立刻写入文件, 而不是被动地等待输出缓冲
区被写入. isatty() 是一个布尔内建函数, 当文件是一个类 tty 设备时返回 True , 否则返回
False . truncate() 方法将文件截取到当前文件指针位置或者到给定 size , 以字节为单位.

文件对象的内建方法列表

复制代码
 1 文件对象的方法 操作
 2 file.close() 关闭文件
 3 file.fileno() 返回文件的描述符(file descriptor ,FD, 整数值)
 4 file.flush() 刷新文件的内部缓冲区
 5 file.isatty() 判断 file 是否是一个类 tty 设备
 6 file.nexta() 返回文件的下一行(类似于 file.readline() ), 或在没有其它行时
 7 引发 StopIteration 异常
 8 file.read(size=-1) 从文件读取 size 个字节, 当未给定 size 或给定负值的时候, 读
 9 取剩余的所有字节, 然后作为字符串返回.如果打开模式无b,则read按字符读取,否则按字节读取
10 file.readline(size=-1) 从文件中读取并返回一行(包括行结束符), 或返回最大 size
11 file=open('test','ab')
12 file.write(bytes('hehe',encoding='utf-8')) 向文件写入字符串  (会覆盖原有数据,坑
13 file.close() 关闭文件
14 file.tell获取当前指针的位置
15 file.read()如果打开模式无b,则read按字符读取,否则按字节读取
16 file.fileno文件描述符
17 file.truncat 截断数据,清除文件指针之后的数据
18 file.seek(off, whence=0) 在文件中移动文件指针, 从 whence ( 0 代表文件其始, 1代表当前位置, 2 代表文件末尾)偏移 off 字节,不论是否有中文,都以字节为单位
19 file.truncate(size=file.tell()) 截取文件到最大 size 字节, 默认为当前文件位置
20 file.writelines(seq) 向文件写入字符串序列 seq ; seq 应该是一个返回字符串的
21 可迭代对象
22 file.readlines(sizhint=0) 读取文件的所有行并作为一个列表返回(包含所有的行结束
23 符); 
复制代码

对文件系统的访问

对文件系统的访问大多通过 Python 的 os 模块实现. 该模块是 Python 访问操作系统功能的主
要接口.
os 模块的文件/目录访问函数

文件处理

复制代码
1 mkfifo()/mknod()a 创建命名管道/创建文件系统节点
2 remove()/unlink() Delete file 删除文件
3 rename()/renames()b 重命名文件
4 *statc() 返回文件信息
5 symlink() 创建符号链接
6 utime() 更新时间戳
7 tmpfile() 创建并打开('w+b')一个新的临时文件
8 walk()a 生成一个目录树下的所有文件名
复制代码

目录/文件夹

1 chdir()/fchdir()a 改变当前工作目录/通过一个文件描述符改变当前工作目录
2 chroot()d 改变当前进程的根目录
3 listdir() 列出指定目录的文件
4 getcwd()/getcwdu()a返回当前工作目录/功能相同, 但返回一个 Unicode 对象
5 mkdir()/makedirs() 创建目录/创建多层目录
6 rmdir()/removedirs() 删除目录/删除多层目录

访问/权限

1 access() 检验权限模式
2 chmod() 改变权限模式
3 chown()/lchown()a 改变 owner 和 group ID/功能相同, 但不会跟踪链接
4 umask() 设置默认权限模式

文件描述符操作

1 open() 底层的操作系统 open (对于文件, 使用标准的内建 open() 函数)
2 read()/write() 根据文件描述符读取/写入数据
3 dup()/dup2() 复制文件描述符号/功能相同, 但是是复制到另一个文件描述符

设备号

1 makedev()a 从 major 和 minor 设备号创建一个原始设备号
2 major()a /minor()a 从原始设备号获得 major/minor 设备号

 os.path 可以完成一些针对路径名的操作. 它提供的函数可以完成管理和操作文
件路径名中的各个部分, 获取文件或子目录信息, 文件路径查询等操作
os.path 模块中的路径名访问函数
分隔

1 basename() 去掉目录路径, 返回文件名
2 dirname() 去掉文件名, 返回目录路径
3 join() 将分离的各部分组合成一个路径名
4 split() 返回 (dirname(), basename()) 元组
5 splitdrive() 返回 (drivename, pathname) 元组
6 splitext() 返回 (filename, extension) 元组

信息

1 getatime() 返回最近访问时间
2 getctime() 返回文件创建时间
3 getmtime() 返回最近文件修改时间
4 getsize() 返回文件大小(以字节为单位)

查询

复制代码
1 exists() 指定路径(文件或目录)是否存在
2 isabs() 指定路径是否为绝对路径
3 isdir() 指定路径是否存在且为一个目录
4 isfile() 指定路径是否存在且为一个文件
5 islink() 指定路径是否存在且为一个符号链接
6 ismount() 指定路径是否存在且为一个挂载点
7 samefile() 两个路径名是否指向同个文件
复制代码


还有大量的其它模块与文件和输入/输出有关, 它们中的大多数都可以在主流平台上工作.

复制代码
 1 base64 提供二进制字符串和文本字符串间的编码/解码操作
 2 binascii 提供二进制和 ASCII 编码的二进制字符串间的编码/解码操作
 3 bz2a 访问 BZ2 格式的压缩文件
 4 csv  访问 csv 文件(逗号分隔文件)
 5 filecmpb 用于比较目录和文件
 6 fileinput 提供多个文本文件的行迭代器
 7 getopt/optparsea 提供了命令行参数的解析/处理
 8 glob/fnmatch 提供 Unix 样式的通配符匹配的功能
 9 gzip/zlib 读写 GNU zip( gzip) 文件(压缩需要 zlib 模块)
10 shutil 提供高级文件访问功能
11 c/StringIO 对字符串对象提供类文件接口
12 tarfilea 读写 TAR 归档文件, 支持压缩文件
13 tempfile 创建一个临时文件(名)
14 uu   格式的编码和解码
15 zipfilec 用于读取 ZIP 归档文件的工具
复制代码

下面列举几个简单的示例:

对文件进行迭代而不使用变量存储文件对象

1 for line in open(finename):
2         print(line)

同时打开两个文件

1 with open('user.txt') as f,open('user1.txt') as f2:
2         pass

获取文件前十行

复制代码
1 with open('db1', 'r', encoding="utf-8") as f1, open("db2", 'w',encoding="utf-8") as f2:
2     times = 0
3     for line in f1:         
4         times += 1 
5         if times <=10:
6             f2.write(line)
7         else:
8             break
复制代码

替换文件内指定的字符串

1 with open('db1', 'r', encoding="utf-8") as f1, open("db2", 'w',encoding="utf-8") as f2:
2     for line in f1:
3         new_str = line.replace("alex", 'st')
4         f2.write(new_str)  

python中readline判断文件读取结束的方法

 

 注:内容来自网络

本文实例讲述了python中readline判断文件读取结束的方法。分享给大家供大家参考。具体分析如下:

大家知道,python中按行读取文件可以使用readline函数,下面现介绍一个按行遍历读取文件的方法,通过这个方法,展开我们要讨论的问题:
复制代码 代码如下:
filename = raw_input('Enter your file name') #输入要遍历读取的文件路径及文件名
file = open(filename,'r')
done = 0
while not done:
aLine = file.readline()
if(aLine != ''):
print aLine,
else:
done = 1
file.close() #关闭文件

上面是我们经常看到的按行遍历一个文件方法,你可能已经注意到我在代码中写的if(aLine != '' ):部分。当readline读取到为空的时候,意味着读到了文件的结束。这个时候,问题就在这里,很多人会想,是不是遇到一个空行,也会被认为是文件的结束呢?这就引入了标题的问题。

事实上,文件的空白行并不会返回一个空行。因为在每一行的末尾还有一个或者多个分隔符,因此“空白行”至少会有一个换行符或者系统使用的其他符号。所以,即使文件中真的包含一个“空白行”,读入的行也不是空的,这就意味着在真实遍历读取到文件结束之前,程序实际上是不会停止的

readline() 和 .readlines() 非常相似。它们都在类似于以下的结构中使用:
Python .readlines()

示例如下:
复制代码 代码如下:
fh = open('c:\autoexec.bat')
for line in fh.readlines():
print line


.readline() 和 .readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理。另一方面,.readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline()。

readlines返回行数问题

官方文档这样写的:
If the optional sizehint argument is present, instead of reading up to EOF, whole lines totalling approximately sizehint bytes (possibly after rounding up to an internal buffer size) are read.

确实是指定大小啊并且会受内部缓冲区大小影响向上取整到内部缓冲区大小。内部缓冲区大约是8k也难怪我每次测试文件大小都是8k(8192)倍数
复制代码 代码如下:
#!/usr/bin/env python
f=open('a.txt').readlines(1)
open('b.txt','w').writelines(f)
open('c.txt','w').writelines(open('a.txt').readlines(200))
open('d.txt','w').writelines(open('a.txt').readlines(9200))
open('e.txt','w').writelines(open('a.txt').readlines(26000))
open('f.txt','w').writelines(open('a.txt').readlines(40000))

希望本文所述对大家的Python程序设计有所帮助。

python 实时遍历日志文件

 

推荐日志处理项目:https://github.com/olajowon/loggrove

首先尝试使用 python open 遍历一个大日志文件,

使用 readlines() 还是 readline() ?

总体上 readlines() 不慢于python 一次次调用 readline(),因为前者的循环在C语言层面,而使用readline() 的循环是在Python语言层面。

但是 readlines() 会一次性把全部数据读到内存中,内存占用率会过高,readline() 每次只读一行,对于读取 大文件, 需要做出取舍。

如果不需要使用 seek() 定位偏移, for line in open('file') 速度更佳。

使用 readlines(),适合量级较小的日志文件

复制代码
 1 p = 0
 2 with open(filepath, 'r+') as f:
 3     f.seek(p, 0)
 4     while True:
 5         lines = f.readlines()
 6         if lines:
 7             print lines
 8             p = f.tell()
 9             f.seek(p, 0)
10         time.sleep(1)
复制代码

使用 readline(),避免内存占用率过大

1 p = 0
2 with open('logs.txt', 'r+') as f:
3     while True:
4         line = f.readline()
5         if line:
6             print line

################## 华丽分割 ##########################

现在尝试使用 tail -F log.txt 动态输出

由于 os.system() , commands.getstatusoutput() 属于一次性执行就拜拜, 最终选择 subprocess.Popen(),

subprocess 模块目的是启动一个新的进程并与之通信,最常用是定义类Popen,使用Popen可以创建进程,并与进程进行交互。

复制代码
1 import subprocess
2 import time
3 
4 p = subprocess.Popen('tail -F log.txt', shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE,)
5 while True:
6    line = p.stdout.readline()
7    if line:
8         print line
复制代码
 

python中的文件对象:
文件对象不仅可以用来访问普通的磁盘文件, 而且也可以访问任何其它类型抽象层面上的"文
件". 一旦设置了合适的"钩子", 你就可以访问具有文件类型接口的其它对象, 就好像访问的是普
通文件一样.

文件内建函数[open()和 file()]

1 open('filename')
2 with open('filename') as f:
3         pass

open函数使用一个文件名作为唯一的强制参数,然后返回一个文件对象。模式和缓冲参数都是可选的,默认为只读模式打开文件。使用with即使发生错误可以关闭文件,
下面列出文件对象的访问的模式:

复制代码
 1 文件模式   操作
 2 r  以只读方式打开
 3 rU 或 Ua 以读方式打开, 同时提供通用换行符支持 (PEP 278)
 4 w  以写方式打开 (必要时清空)
 5 a  以追加模式打开 (从 EOF 开始, 必要时创建新文件)
 6 r+ 以读写模式打开
 7 w+ 以读写模式打开 (参见 w )
 8 a+ 以读写模式打开 (参见 a )
 9 rb 以二进制读模式打开
10 wb 以二进制写模式打开 (参见 w )
11 ab 以二进制追加模式打开 (参见 a )
12 rb+ 以二进制读写模式打开 (参见 r+ )
13 wb+ 以二进制读写模式打开 (参见 w+ )
14 ab+ 以二进制读写模式打开 (参见 a+ )
15 x    如果文件存在报错,不存在则创建
16 ***加b模式打开,不可以在指定encoding,切写入时也需要转换为字节写入文件
17 
18 下面是一些打开文件的例子:
19 f = open('/etc/motd') # 以读方式打开
20 f = open('test', 'w') # 以写方式打开
21 f = open('data', 'r+') # 以读写方式打开
22 f = open('io.sys', 'rb') # 以二进制读模式打开
23 
24 bytes 字符串转换字节类型
25 n=bytes(李杰,encoding='utf-8')[转换的字符,可以是变量,转换后的编码]
26 字节转换为字符串
27 str(bytes(李杰,encoding='utf-8'),encoding='utf-8)
28 文件操作
复制代码

open() 和 file() 函数具有相同的功能, 可以任意替换.任何使用 open() 的地方, 都可以使用 file() 替换它.建议使用 open() 来读写文件, 在处理文件对象时使用 file() 。open() 成功执行并返回一个文件对象之后, 所有对该文件的后续操作都将通过这个"句柄"进行.

文件方法可以分为四类: 输入, 输出, 文件内移动, 以及杂项操作. 
输入

read() 方法用来直接读取字节到字符串中, 最多读取给定数目个字节. 如果没有给定 size
参数(默认值为 -1)或者 size 值为负, 文件将被读取直至末尾.

指定读取size:

readline() 方法读取打开文件的一行(读取下个行结束符之前的所有字节). 然后整行,包括行
结束符,作为字符串返回. 和 read() 相同, 它也有一个可选的 size 参数, 默认为 -1, 代表读至
行结束符. 如果提供了该参数, 那么在超过 size 个字节后会返回不完整的行.

readlines() 方法并不像其它两个输入方法一样返回一个字符串. 它会读取所有(剩余的)行然
后把它们作为一个字符串列表返回. 它的可选参数 sizhint 代表返回的最大字节大小. 如果它大
于 0 , 那么返回的所有行应该大约有 sizhint 字节(可能稍微大于这个数字, 因为需要凑齐缓冲区
大小).

输出
write() 内建方法功能与 read() 和 readline() 相反. 它把含有文本数据或二进制数据块的
字符串写入到文件中去.

文件内移动
seek() 方法(类似 C 中的 fseek() 函数)可以在文件中移动文件指针到不同的位置. offset
字节代表相对于某个位置偏移量. 位置的默认值为 0 , 代表从文件开头算起(即绝对偏移量), 1 代
表从当前位置算起, 2 代表从文件末尾算起. 如果你是一个 C 程序员,并且使用过了 fseek() , 那
么,0, 1, 2 分别对应着常量 SEEK_SET, SEEK_CUR, 以及 SEEK_END. 当人们打开文件进行读写操
作的时候就会接触到 seek()方法。

#跳过前五个字符,读取之后的内容

truncate() 方法, 它接受一个可选的 size 作为参数. 如果给定, 那么文
件将被截取到最多 size 字节处. 如果没有传递 size 参数, 那么默认将截取到文件的当前位置.
例如, 你刚打开了一个文件, 然后立即调用 truncate() 方法, 那么你的文件(内容)实际上被删除,
这时候你是其实是从 0 字节开始截取的( tell() 将会返回这个数值 )

其他:

close() 
关闭文件来结束对它的访问. Python 垃圾收集机制也会在文件对象的引用计数降
至零的时候自动关闭文件. 这在文件只有一个引用时发生, 例如 f = open(...), 然后 f 在原文
件显式地关闭前被赋了另一个文件对象. 良好的编程习惯要求在重新赋另个文件对象前关闭这个文
件. 如果你不显式地关闭文件, 那么你可能丢失输出缓冲区的数据.

fileno() 方法返回打开文件的描述符. 这是一个整数, 可以用在如 os 模块( os.read() )的
一些底层操作上

flush() 方法会直接把内部缓冲区中的数据立刻写入文件, 而不是被动地等待输出缓冲
区被写入. isatty() 是一个布尔内建函数, 当文件是一个类 tty 设备时返回 True , 否则返回
False . truncate() 方法将文件截取到当前文件指针位置或者到给定 size , 以字节为单位.

文件对象的内建方法列表

复制代码
 1 文件对象的方法 操作
 2 file.close() 关闭文件
 3 file.fileno() 返回文件的描述符(file descriptor ,FD, 整数值)
 4 file.flush() 刷新文件的内部缓冲区
 5 file.isatty() 判断 file 是否是一个类 tty 设备
 6 file.nexta() 返回文件的下一行(类似于 file.readline() ), 或在没有其它行时
 7 引发 StopIteration 异常
 8 file.read(size=-1) 从文件读取 size 个字节, 当未给定 size 或给定负值的时候, 读
 9 取剩余的所有字节, 然后作为字符串返回.如果打开模式无b,则read按字符读取,否则按字节读取
10 file.readline(size=-1) 从文件中读取并返回一行(包括行结束符), 或返回最大 size
11 file=open('test','ab')
12 file.write(bytes('hehe',encoding='utf-8')) 向文件写入字符串  (会覆盖原有数据,坑
13 file.close() 关闭文件
14 file.tell获取当前指针的位置
15 file.read()如果打开模式无b,则read按字符读取,否则按字节读取
16 file.fileno文件描述符
17 file.truncat 截断数据,清除文件指针之后的数据
18 file.seek(off, whence=0) 在文件中移动文件指针, 从 whence ( 0 代表文件其始, 1代表当前位置, 2 代表文件末尾)偏移 off 字节,不论是否有中文,都以字节为单位
19 file.truncate(size=file.tell()) 截取文件到最大 size 字节, 默认为当前文件位置
20 file.writelines(seq) 向文件写入字符串序列 seq ; seq 应该是一个返回字符串的
21 可迭代对象
22 file.readlines(sizhint=0) 读取文件的所有行并作为一个列表返回(包含所有的行结束
23 符); 
复制代码

对文件系统的访问

对文件系统的访问大多通过 Python 的 os 模块实现. 该模块是 Python 访问操作系统功能的主
要接口.
os 模块的文件/目录访问函数

文件处理

复制代码
1 mkfifo()/mknod()a 创建命名管道/创建文件系统节点
2 remove()/unlink() Delete file 删除文件
3 rename()/renames()b 重命名文件
4 *statc() 返回文件信息
5 symlink() 创建符号链接
6 utime() 更新时间戳
7 tmpfile() 创建并打开('w+b')一个新的临时文件
8 walk()a 生成一个目录树下的所有文件名
复制代码

目录/文件夹

1 chdir()/fchdir()a 改变当前工作目录/通过一个文件描述符改变当前工作目录
2 chroot()d 改变当前进程的根目录
3 listdir() 列出指定目录的文件
4 getcwd()/getcwdu()a返回当前工作目录/功能相同, 但返回一个 Unicode 对象
5 mkdir()/makedirs() 创建目录/创建多层目录
6 rmdir()/removedirs() 删除目录/删除多层目录

访问/权限

1 access() 检验权限模式
2 chmod() 改变权限模式
3 chown()/lchown()a 改变 owner 和 group ID/功能相同, 但不会跟踪链接
4 umask() 设置默认权限模式

文件描述符操作

1 open() 底层的操作系统 open (对于文件, 使用标准的内建 open() 函数)
2 read()/write() 根据文件描述符读取/写入数据
3 dup()/dup2() 复制文件描述符号/功能相同, 但是是复制到另一个文件描述符

设备号

1 makedev()a 从 major 和 minor 设备号创建一个原始设备号
2 major()a /minor()a 从原始设备号获得 major/minor 设备号

 os.path 可以完成一些针对路径名的操作. 它提供的函数可以完成管理和操作文
件路径名中的各个部分, 获取文件或子目录信息, 文件路径查询等操作
os.path 模块中的路径名访问函数
分隔

1 basename() 去掉目录路径, 返回文件名
2 dirname() 去掉文件名, 返回目录路径
3 join() 将分离的各部分组合成一个路径名
4 split() 返回 (dirname(), basename()) 元组
5 splitdrive() 返回 (drivename, pathname) 元组
6 splitext() 返回 (filename, extension) 元组

信息

1 getatime() 返回最近访问时间
2 getctime() 返回文件创建时间
3 getmtime() 返回最近文件修改时间
4 getsize() 返回文件大小(以字节为单位)

查询

复制代码
1 exists() 指定路径(文件或目录)是否存在
2 isabs() 指定路径是否为绝对路径
3 isdir() 指定路径是否存在且为一个目录
4 isfile() 指定路径是否存在且为一个文件
5 islink() 指定路径是否存在且为一个符号链接
6 ismount() 指定路径是否存在且为一个挂载点
7 samefile() 两个路径名是否指向同个文件
复制代码


还有大量的其它模块与文件和输入/输出有关, 它们中的大多数都可以在主流平台上工作.

复制代码
 1 base64 提供二进制字符串和文本字符串间的编码/解码操作
 2 binascii 提供二进制和 ASCII 编码的二进制字符串间的编码/解码操作
 3 bz2a 访问 BZ2 格式的压缩文件
 4 csv  访问 csv 文件(逗号分隔文件)
 5 filecmpb 用于比较目录和文件
 6 fileinput 提供多个文本文件的行迭代器
 7 getopt/optparsea 提供了命令行参数的解析/处理
 8 glob/fnmatch 提供 Unix 样式的通配符匹配的功能
 9 gzip/zlib 读写 GNU zip( gzip) 文件(压缩需要 zlib 模块)
10 shutil 提供高级文件访问功能
11 c/StringIO 对字符串对象提供类文件接口
12 tarfilea 读写 TAR 归档文件, 支持压缩文件
13 tempfile 创建一个临时文件(名)
14 uu   格式的编码和解码
15 zipfilec 用于读取 ZIP 归档文件的工具
复制代码

下面列举几个简单的示例:

对文件进行迭代而不使用变量存储文件对象

1 for line in open(finename):
2         print(line)

同时打开两个文件

1 with open('user.txt') as f,open('user1.txt') as f2:
2         pass

获取文件前十行

复制代码
1 with open('db1', 'r', encoding="utf-8") as f1, open("db2", 'w',encoding="utf-8") as f2:
2     times = 0
3     for line in f1:         
4         times += 1 
5         if times <=10:
6             f2.write(line)
7         else:
8             break
复制代码

替换文件内指定的字符串

1 with open('db1', 'r', encoding="utf-8") as f1, open("db2", 'w',encoding="utf-8") as f2:
2     for line in f1:
3         new_str = line.replace("alex", 'st')
4         f2.write(new_str)  

python中readline判断文件读取结束的方法

 

 注:内容来自网络

本文实例讲述了python中readline判断文件读取结束的方法。分享给大家供大家参考。具体分析如下:

大家知道,python中按行读取文件可以使用readline函数,下面现介绍一个按行遍历读取文件的方法,通过这个方法,展开我们要讨论的问题:
复制代码 代码如下:
filename = raw_input('Enter your file name') #输入要遍历读取的文件路径及文件名
file = open(filename,'r')
done = 0
while not done:
aLine = file.readline()
if(aLine != ''):
print aLine,
else:
done = 1
file.close() #关闭文件

上面是我们经常看到的按行遍历一个文件方法,你可能已经注意到我在代码中写的if(aLine != '' ):部分。当readline读取到为空的时候,意味着读到了文件的结束。这个时候,问题就在这里,很多人会想,是不是遇到一个空行,也会被认为是文件的结束呢?这就引入了标题的问题。

事实上,文件的空白行并不会返回一个空行。因为在每一行的末尾还有一个或者多个分隔符,因此“空白行”至少会有一个换行符或者系统使用的其他符号。所以,即使文件中真的包含一个“空白行”,读入的行也不是空的,这就意味着在真实遍历读取到文件结束之前,程序实际上是不会停止的

readline() 和 .readlines() 非常相似。它们都在类似于以下的结构中使用:
Python .readlines()

示例如下:
复制代码 代码如下:
fh = open('c:\autoexec.bat')
for line in fh.readlines():
print line


.readline() 和 .readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理。另一方面,.readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline()。

readlines返回行数问题

官方文档这样写的:
If the optional sizehint argument is present, instead of reading up to EOF, whole lines totalling approximately sizehint bytes (possibly after rounding up to an internal buffer size) are read.

确实是指定大小啊并且会受内部缓冲区大小影响向上取整到内部缓冲区大小。内部缓冲区大约是8k也难怪我每次测试文件大小都是8k(8192)倍数
复制代码 代码如下:
#!/usr/bin/env python
f=open('a.txt').readlines(1)
open('b.txt','w').writelines(f)
open('c.txt','w').writelines(open('a.txt').readlines(200))
open('d.txt','w').writelines(open('a.txt').readlines(9200))
open('e.txt','w').writelines(open('a.txt').readlines(26000))
open('f.txt','w').writelines(open('a.txt').readlines(40000))

希望本文所述对大家的Python程序设计有所帮助。

python 实时遍历日志文件

 

推荐日志处理项目:https://github.com/olajowon/loggrove

首先尝试使用 python open 遍历一个大日志文件,

使用 readlines() 还是 readline() ?

总体上 readlines() 不慢于python 一次次调用 readline(),因为前者的循环在C语言层面,而使用readline() 的循环是在Python语言层面。

但是 readlines() 会一次性把全部数据读到内存中,内存占用率会过高,readline() 每次只读一行,对于读取 大文件, 需要做出取舍。

如果不需要使用 seek() 定位偏移, for line in open('file') 速度更佳。

使用 readlines(),适合量级较小的日志文件

复制代码
 1 p = 0
 2 with open(filepath, 'r+') as f:
 3     f.seek(p, 0)
 4     while True:
 5         lines = f.readlines()
 6         if lines:
 7             print lines
 8             p = f.tell()
 9             f.seek(p, 0)
10         time.sleep(1)
复制代码

使用 readline(),避免内存占用率过大

1 p = 0
2 with open('logs.txt', 'r+') as f:
3     while True:
4         line = f.readline()
5         if line:
6             print line

################## 华丽分割 ##########################

现在尝试使用 tail -F log.txt 动态输出

由于 os.system() , commands.getstatusoutput() 属于一次性执行就拜拜, 最终选择 subprocess.Popen(),

subprocess 模块目的是启动一个新的进程并与之通信,最常用是定义类Popen,使用Popen可以创建进程,并与进程进行交互。

复制代码
1 import subprocess
2 import time
3 
4 p = subprocess.Popen('tail -F log.txt', shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE,)
5 while True:
6    line = p.stdout.readline()
7    if line:
8         print line
复制代码
 

 注:内容来自网络

本文实例讲述了python中readline判断文件读取结束的方法。分享给大家供大家参考。具体分析如下:

大家知道,python中按行读取文件可以使用readline函数,下面现介绍一个按行遍历读取文件的方法,通过这个方法,展开我们要讨论的问题:
复制代码 代码如下:
filename = raw_input('Enter your file name') #输入要遍历读取的文件路径及文件名
file = open(filename,'r')
done = 0
while not done:
aLine = file.readline()
if(aLine != ''):
print aLine,
else:
done = 1
file.close() #关闭文件

上面是我们经常看到的按行遍历一个文件方法,你可能已经注意到我在代码中写的if(aLine != '' ):部分。当readline读取到为空的时候,意味着读到了文件的结束。这个时候,问题就在这里,很多人会想,是不是遇到一个空行,也会被认为是文件的结束呢?这就引入了标题的问题。

事实上,文件的空白行并不会返回一个空行。因为在每一行的末尾还有一个或者多个分隔符,因此“空白行”至少会有一个换行符或者系统使用的其他符号。所以,即使文件中真的包含一个“空白行”,读入的行也不是空的,这就意味着在真实遍历读取到文件结束之前,程序实际上是不会停止的

readline() 和 .readlines() 非常相似。它们都在类似于以下的结构中使用:
Python .readlines()

示例如下:
复制代码 代码如下:
fh = open('c:\autoexec.bat')
for line in fh.readlines():
print line


.readline() 和 .readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理。另一方面,.readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline()。

readlines返回行数问题

官方文档这样写的:
If the optional sizehint argument is present, instead of reading up to EOF, whole lines totalling approximately sizehint bytes (possibly after rounding up to an internal buffer size) are read.

确实是指定大小啊并且会受内部缓冲区大小影响向上取整到内部缓冲区大小。内部缓冲区大约是8k也难怪我每次测试文件大小都是8k(8192)倍数
复制代码 代码如下:
#!/usr/bin/env python
f=open('a.txt').readlines(1)
open('b.txt','w').writelines(f)
open('c.txt','w').writelines(open('a.txt').readlines(200))
open('d.txt','w').writelines(open('a.txt').readlines(9200))
open('e.txt','w').writelines(open('a.txt').readlines(26000))
open('f.txt','w').writelines(open('a.txt').readlines(40000))

希望本文所述对大家的Python程序设计有所帮助。

推荐日志处理项目:https://github.com/olajowon/loggrove

首先尝试使用 python open 遍历一个大日志文件,

使用 readlines() 还是 readline() ?

总体上 readlines() 不慢于python 一次次调用 readline(),因为前者的循环在C语言层面,而使用readline() 的循环是在Python语言层面。

但是 readlines() 会一次性把全部数据读到内存中,内存占用率会过高,readline() 每次只读一行,对于读取 大文件, 需要做出取舍。

如果不需要使用 seek() 定位偏移, for line in open('file') 速度更佳。

使用 readlines(),适合量级较小的日志文件

复制代码
 1 p = 0
 2 with open(filepath, 'r+') as f:
 3     f.seek(p, 0)
 4     while True:
 5         lines = f.readlines()
 6         if lines:
 7             print lines
 8             p = f.tell()
 9             f.seek(p, 0)
10         time.sleep(1)
复制代码

使用 readline(),避免内存占用率过大

1 p = 0
2 with open('logs.txt', 'r+') as f:
3     while True:
4         line = f.readline()
5         if line:
6             print line

################## 华丽分割 ##########################

现在尝试使用 tail -F log.txt 动态输出

由于 os.system() , commands.getstatusoutput() 属于一次性执行就拜拜, 最终选择 subprocess.Popen(),

subprocess 模块目的是启动一个新的进程并与之通信,最常用是定义类Popen,使用Popen可以创建进程,并与进程进行交互。

复制代码
1 import subprocess
2 import time
3 
4 p = subprocess.Popen('tail -F log.txt', shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE,)
5 while True:
6    line = p.stdout.readline()
7    if line:
8         print line
复制代码

猜你喜欢

转载自www.cnblogs.com/uesta/p/10470084.html
今日推荐