http://blog.csdn.net/pipisorry/article/details/37769669
python文件输入输出教程

python文件读取

打开文件对象内置函数open()

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)¶

得到一个文件对象(file object):open(filename, mode='r')

函数参数:模式mode

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

还有一个模式U,不过已经完全默认了,不使用了。There is an additional mode character permitted, 'U', which no longer has any effect, and is considered deprecated. It previously enabled universal newlines in text mode, which became the default behaviour in Python 3.0.

1 python对同一个文件进行读后写(读取文件修改后再写入)?

1 如果使用w+时,还没读就被刷新覆盖了,文件什么都没了

2 使用r+打开文件后再seek(0)回到文件头进行写

with open(filename, 'r+') as file:
    lines = file.read()
    lines = re.sub('<configuration>.*</configuration>', s, lines, flags = re.S)
    file.seek(0)
    file.write(lines)

2 文本与二进制方式打开文件的区别

'wb'写入,在py3中是用有编码写入的,所以需要是py3的bytes或者py2的str(如f.write(b' '.join([word, tag, tag_pred]) + b'\n')),文本则没有。但是'wb'写入的,可以直接通过'r', encodeing='utf-8'读取。

word, tag, tag_pred是bytes的话,py3两种方式写入:

with open('results/score/{}.preds.txt'.format(name), 'wb') as f:
    f.write(b' '.join([word, tag, tag_pred]) + b'\n')

或者

with open('results/score/{}.preds.txt'.format(name), 'w', encoding='utf-8') as f:

f.write(' '.join([word.decode('utf-8'), tag.decode('utf-8'), tag_pred.decode('utf-8')]) + '\n')

Windows平台下 :

如果以“文本”方式打开文件,当读取文件的时候,系统会将所有的"/r/n"转换成"/n";当写入文件的时候,系统会将"/n"转换成"/r/n"写入。
如果以"二进制"方式打开文件,则读/写都不会进行这样的转换。

lines may be terminated by any of the following: the Unix end-of-line convention ’\n’, the Macintosh convention ’\r’, or the Windows convention ’\r\n’. All of these external representations are seen as ’\n’ by the Python program.{12 Chapter 2. Built-in Functions The Python Library Reference, Release 2.6}

2 rU 或 Ua 以读方式打开, 同时提供通用换行符支持(PEP 278).

3 ‘w'模式写入时文件不存在会自动创建,但目录不存在会报错:FileNotFoundError: [Errno 2] No such file or directory: './doc_word_mat/AlarmClock_doc_word_mat_file.txt'

if not exists('./doc_word_mat'):makedir('./doc_word_mat')
doc_word_mat_file = open('./doc_word_mat/file.txt', 'w')

[文本与二进制方式打开文件的区别]

3 编码encoding(打开文件的编码方式)

encoding is the name of the encoding used to decode or encode the file. This should only be used in text mode. The default encoding isplatform dependent, but any encoding supported by Python can bepassed.

默认方式与平台相关,如linux下可能默认是utf-8, windows下可能是gbk。

py3中open使用encoding打开文件后,字符串是unicode(可能是先使用encoding读取字符串,再decode成unicode了)。

带BOM的utf-8编码的txt文件时开头会有一个多余的字符\ufeff,BOM被解码为一个字符\ufeff,如何去掉?修改encoding为utf-8_sig或者utf_8_sig

[python字符串编码及乱码解决方案]

4 python文件读取路径

a.py: with open("***.txt", encoding='utf-8')as f

txt文件所在目录对应的是这个代码执行的目录(可能被另一个目录中的文件调用,则目录就是那个文件所在目录),而不是当前所在的文件a.py所在的目录。

所以这样打开文件有风险,可能***.txt和这行代码所在文件a.py在一个目录下,但是代码是在另一个目录(如b.py调用a.py中的函数)执行,这样就会出错:file not found error或者no file or directory named ***.txt

lz提供一个解决方案:

所有相对路径打开的文件改成这样的:

os.path.join(os.path.split(os.path.realpath(__file__))[0], filename)

这样就不会出错了,lz建议都这样写,因为在很多项目中py文件移来移去,虽然相对路径没变,但是py文件中的代码可以是被其它地方调用执行的,还是可能出错,lz遇到无数次了,所以如此建议~

5 python文件中的读入科学计数法的数字

float(num)

皮皮blog

文件对象的方法

f.read(size)        返回最多size个字节的str,当size缺省或为负值时,整个文件内容都被作为一个str读出来,若到文末,返回空串' '

f.readline()        返回文件中一行的str,末尾加上换行符'\n'

list(f) or f.readlines()         If you want to read all the lines of a file in a list

f.write(string)    将string写入file,返回成功写入的字符个数。

f.tell()         returns an integer giving the file object’s current position in the filerepresented as number of bytes from the beginning of the file when in binary mode andan opaque number when in text mode.

f.close()             文件对象使用完一定要close()掉。

f.seek(offset, from_what)      改变文件对象的位置(position),offset为偏移量,from_what为参考位置,为0时从文件开头, 为1时使用当前的文件位置,为2是使用文件末尾位置。from_what默认为0

[Methods of File Objects¶]

使用示例

1 按行从文件中读取,有一种简便的方式

1 f = open("print.py", "r+")
2 for line in f:             #line的结尾会自动有一个“\n"
3     print(line, end=" ")   #所以end=' ', 默认会又输出换行符

2 把print.py中的内容读出来,写到一个新文件中,在打印出来。

f = open("print.py", "r")
f2 = open("wyfile", "w+") #使用w+文件不存在时候才会创建
for line in f:f2.write(line)
f2.seek(0)       #这行语句之前,f2的位置在文末,所以必须调整到文件开头。
print(f2.read(), end=' ')
f.close()       #记住要释放
f2.colse()

[Reading and Writing Files¶]

皮皮blog

Python读取文件的几种方法

1. 最基本的读文件方法

file = open("sample.txt")
    line = file.readline()
    for line in lines:
        pass # do something
  一行一行得从文件读数据,显然比较慢;不过很省内存。

2. 带缓存的文件读取

lines = file.readlines(100000)
    for line in lines:
        pass # do something
事实证明,用同样的数据测试,它每秒可以读96900行数据!效率是第一种方法的3倍!

3.linecache文件读取

lines = linecache.getlines(r'.\datasets\lastfm-dataset-1K\item_item_csr_mat.mtx')[2:-1]
for l in lines:pass

读取速度是前两个的N倍--///
读取并表示成相同数据类型的时间比较

s = time.time()
lines = [line.split() for line in linecache.getlines(checkin_filename)]
e = time.time()
print(e - s)
lines = np.loadtxt(checkin_filename, dtype=bytes).astype(str)
s = time.time()
print(s - e)
lines = pd.read_csv(checkin_filename, sep='\t', header=None, parse_dates=[1])
e = time.time()
print(e - s)

11.72770071029663
168.77640986442566
130.63407826423645

4.Python with open file 用with语句打开文件

python中的with的作用是自动释放对象,即使对象在使用的过程中有异常抛出。可以使用with的类型必须实现__enter__ __exit__。我的理解是=try...finally{},在finally中调用了释放函数。

[类似与CSharp中的using(){}关键字,用来自动确保调用对象的dispose()方法,即使对象有异常抛出。C#中可以使用using{}的对象必须已经实现了IDispose接口。]

def TestWith():

with open("myfile.txt") as f:
     for line in f:
         print (line)
  f.readline() #f is already clean up here, here will meet ValueError exception
Note:
1. with + try...except既能让对象自动释放,又包含了异常捕获的功能
2.The with statement is a useful when accessing anything that supports the context management protocol. Which meansopen() for example. It basically makes sure that any set up and clean up code, such as closing files, is run without having to worry about it.
[python - 异常处理、with语句]
[浅谈 Python 的 with 语句]
[python with as语法]

[模块contextlib,使你不用构造含有__enter__, __exit__的类就可以使用with]

5. python以batch的方式读取文件,一次读取n行

for next_n_lines in zip_longest(*[file] * batch_size, fillvalue=None)

即先生成一个batch_size大小内容全为同一个文件的list,再解构,生成一个tuple,list中的文件其实是按照顺序zip的,每次zip file都会移动batch_size行,不足的行用None替代。

Note: 注意batch处理时,fillvalue值可以选择不处理,直接抛弃。

[How to chunk a list in Python 3?]

Python文件关闭机制

1. 最简单的就是我们可以通过调用f.close()显式地关闭文件。一旦我们关闭了文件,该文件对象依然存在,但是我们无法再通过它来读取文件内容了,而且文件对象返回的可打印内容也表明文件已经被关闭。

2. 打开文件的优选最佳实践方式是使用前面的 “with” 语句。在 “with” 打开的代码块内,文件是打开的,而且可以自由读取。然而,一旦Python代码从 “with” 负责的代码段退出,文件会自动关闭。所以,通过使用 “with”,你避免了显式地关闭文件的操作。Python 会以一种不那么有 Python 风格的方式在幕后神奇而静静地替你关闭文件。

但是你不显式地关闭文件会怎样?如果你有点懒,既不使用 “with” 代码块也不调用f.close()怎么办?这时文件会什么时候关闭?
我总是假定当对象的引用计数降为0时,Python会关闭文件,进而垃圾回收机制清理文件对象。当我们读文件时很难证明或核实这一点,但写入文件时却很容易。这是因为当写入文件时,内容并不会立即刷新到磁盘(除非你向“open”方法的第三个可选参数传入“False”),只有当文件关闭时才会刷新。

f = open('/tmp/output', 'w')
f.write('abcn')
f.write('defn')
# check contents of /tmp/output (1)
del(f)
# check contents of /tmp/output (2)
# exit from Python
# check contents of /tmp/output (3)

实验表明:
1. Python 2.7,报告显示在阶段一文件存在但是是空的,阶段二和阶段三中文件包含所有的内容。这样,在CPython 2.7中我最初的直觉似乎是正确的:当一个文件对象被垃圾回收时,它的 __del__ (或者等价的)方法会刷新并关闭文件。而且在我的IPython进程中调用“lsof”命令显示文件确实在引用对象移除后被关闭了。

2. Python3 ,得到了相同的结果。移除对文件对象最后的引用后会导致文件被刷新并且被关闭。

3. PyPy 和 Jython下,得到了不同的结果!删除文件对象的引用后——也就是在阶段2,并没有导致文件内容被刷入磁盘。我不得不假设这和垃圾回收机制的不同或其他在 PyPy 和 CPython中工作机制的不同有关系。但是如果你在 PyPy中运行程序,就绝不要指望仅仅因为文件对象的引用结束,文件就会被刷新和关闭。命令 lsof 显示直到Python进程退出时文件才会被释放。也就是说,从 Python 退出确实会确保缓存中的数据写入磁盘。

4.在 Python 2.7 的环境下,“abcn” * 1000 语句执行后没有任何东西写入。但“defn” * 1000 语句执行后,文件包含有4096个字节——可能代表缓冲区的大小。调用 del(f) 删除文件对象的引用导致数据被刷入磁盘和文件关闭,此时文件中共有8000字节的数据。所以忽略字符串大小的话 Python 2.7 的行为表现基本相同。唯一不同的是如果超出了缓冲区的大小,那么一些数据将在最后文件关闭数据刷新前写入磁盘。

换做是Python 3的话,情况就有些不同了。f.write执行后没有任何数据会写入。但是文件对象引用一旦结束,文件就会刷新并关闭。这可能是缓冲区很大的缘故。但毫无疑问,删除文件对象引用会使文件刷新并关闭。

5. 至于 PyPy 和 Jython,对大文件和小文件的操作结果都一样:文件在 PyPy 或 Jython 进程结束的时候刷新并关闭,而不是在文件对象的引用结束的时候。

Note:然而如果使用 “with” 进行了实验。在所有情况下,我们都能够轻松的预测文件是何时被刷新和关闭的——就是当退出代码段,并且上下文管理器在后台调用合适方法的时候。
如果你不使用“with”,那么至少在非常简单的情形下,你的数据不一定有丢失的危险。然而你还是不能确定数据到底是在文件对象引用结束还是程序退出的时候被保存的。如果你假定因为对文件唯一的引用是一个本地变量所以文件在函数返回时会关闭,那么事实一定会让你感到吃惊。如果你有多个进程或线程同时对一个文件进行写操作,那么你真的要非常小心了。
[Python文件关闭机制详解]

皮皮blog

python文件读取技巧

计算文件的行数

最简单的办法是把文件读入一个大的列表中,然后统计列表的长度.如果文件的路径是以参数的形式filepath传递的,那么只用一行代码就可以完成我们的需求了:
count = len(open(filepath,'rU').readlines())
如果是非常大的文件,上面的方法可能很慢,甚至失效.此时,可以使用循环来处理:
count = -1
for count, line in enumerate(open(thefilepath, 'rU')):
   pass
count += 1
另外一种处理大文件比较快的方法是统计文件中换行符的个数'\n  '(或者包含'\n'的字串,如在windows系统中):
count = 0
thefile = open(thefilepath, 'rb')    #参数'rb'是必须的,否则在windows系统上,上面的代码会非常慢.
while True:
   buffer = thefile.read(8192*1024)
   if not buffer:
       break
   count += buffer.count('\n')
thefile.close( )

python对目录下的文件排序

[http://1.guotie.sinaapp.com/?p=26]

python读入文件到矩阵中

1. numpy读取

[numpy教程:基本输入输出和文件输入输出Input and output ]

2.pandas读取

[pandas小记:pandas数据输入输出]

皮皮blog

from:http://blog.csdn.net/pipisorry/article/details/37769669
ref: [Reading and Writing Files¶]

[python文件和目录访问File and Directory Access]***
Python格式化输出到文件
python读写word、csv、json文件
python文件、目录及路径操作
python模块 - pickle模块
使用 Python 读取 8 GB 大小的文件

Python文件输入输出相关推荐

  1. python 学习笔记 5 -- 文件输入输出

    本文主要介绍python下的文件输入输出操作,python的文件操作简单易用-通过本文相信你可以熟练掌握file和pickle这两种输入输出操作! 1.文件 你可以通过创建一个file类的对象来打开一 ...

  2. python 中文件输入输出及os模块对文件系统的操作

    整理了一下python 中文件的输入输出及主要介绍一些os模块中对文件系统的操作. 文件输入输出 1.内建函数open(file_name,文件打开模式,通用换行符支持),打开文件返回文件对象. 2. ...

  3. python数据文件输入输出_python 文件输入与输出

    python文件读写 python 进行文件读写的内建函数是open或file file_hander(文件句柄或者叫做对象)= open(filename,mode) mode: 模式    说明 ...

  4. Python Qt GUI设计:将UI文件转换为Python文件的三种妙招(基础篇—2)

    目录 1.创建项目 2.将.ui文件生成.py文件 2.1.Eric 6编译 2.2.Python命令行编译 2.3.脚本编译 3.界面.逻辑分离思想 在开始本文之前提醒各位朋友,Python记得安装 ...

  5. Python文件的使用

    本章导言 什么是数据格式化 前言: -学完本章,看待数据会有一种规范/格式化的视角 -方法论:从Python角度理解文件和数据表示 -实践能力:学会编写带有文件输入输出的程序 1. 文件的使用 文件的 ...

  6. python文件输入和输出

    第一步 排除文件打开方式错误: r只读,r+读写,不创建 w新建只写,w+新建读写,二者都会将文件内容清零 (以w方式打开,不能读出.w+可读写) w+与r+区别: r+:可读可写,若文件不存在,报错 ...

  7. python文件处理seek_python文件操作 seek(),tell()

    seek():移动文件读取指针到指定位置 tell():返回文件读取指针的位置 seek()的三种模式: (1)f.seek(p,0)  移动当文件第p个字节处,绝对位置 (2)f.seek(p,1) ...

  8. ecilpse+python中文输入输出

    前提条件:python版本3.5.1,Eclipse SDK版本 3.5.0 ecilpse编辑器默认编码为gbk,所以需要调整ecilpse编码格式为utf-8才可以实现python语言中文的输入输 ...

  9. python标准输入输出语句_Python“门卫”之输入输出

    大家好,结束了Python"六君子"之数据类型的学习,大家收获怎么样呢!肯定各种丰收,对不!不过,听一些读者讲,他们也稍微有一丢丢小小的遗憾,其一是自己辛辛苦苦在IDLE中敲的代码 ...

  10. seek是python文件操作方法吗,seek引发的python文件读写的问题

    我的需求很简单,就是统计一下我的安装脚本执行的次数和时间,格式是这样的 install_times:1|install_times:2018-09-03 15:58:46 install_times: ...

最新文章

  1. windows环境下安装scrapy框架报错问题--最快捷有效的解决方案
  2. 【数据结构-树】4.图解平衡二叉树和哈夫曼编码(逐步演绎,一文读懂)
  3. 【培训稿件】构建WCF面向服务的应用程序(包含ppt,源代码)
  4. VC嵌入python时debug版lib下载
  5. HashMap 为什么在链表长度为 8 的时候转红黑树,为啥不能是 9 是 10?
  6. 区块链100讲:区块链的TPS性能
  7. 【ios】开发者笔记之迈出第一步
  8. Mina Protocol将主网候选版本发布时间延后一小时至3月17日8点
  9. NAR:蛋白功能层级注释数据库eggNOG5
  10. adb连接 红米5手机
  11. kali linux MD5解密,md5文件加密_文件MD5解密/加密方法 MD5在线加密解密
  12. steam网络相关问题-社区错误代码118/无法自动登陆/短期内来自您网络的失败登录过多/无法连接至steam网络(2021/2/18更新)
  13. 管家婆单机版_安稳之托 祝福管家婆软件25周年
  14. 【HTTPServer】借助Python建立简易的HTTP服务
  15. 使用通达信一次性获取沪深300成分股
  16. 日志分析ELK安装日志分析系统
  17. Geoserver中引用多个图层
  18. 微信小程序-----解决swiper默认高度150px
  19. 多线程进阶=》JUC并发编程02
  20. 生活有哪些残忍的真相?

热门文章

  1. 几种.NET平台数据持久化框架介绍
  2. poi导出word模板项目实例(一个文件)
  3. BroadcastReceiver 用于接收广播
  4. php遍历文件夹(获得文件名)
  5. XML数据库与db4o的简要对比
  6. Nginx-Web管理系统
  7. 第二十三篇 玩转数据结构——栈(Stack)
  8. yum 崩溃的解决方法
  9. 串口UART学习笔记(一)
  10. Nginx安装出现错误解决记录