专栏首页优雅R两天研习Python基础(十) 文件处理

两天研习Python基础(十) 文件处理

open函数

  • 语法:open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
>>> import locale
>>> locale.getpreferredencoding()
'UTF-8'
  • 本文中我们将看到下面一些文件操作模式
    • r打开文件用来读入
    • w打开文件用来写入
    • a打开文件用来追加
  • 默认是文本模式,所以传入rrt等价
    • 对于二进制模式,将对应是rbwb等等
  • locale.getpreferredencoding()给出默认使用的编码方式
  • Python文档 - open[1]
  • Python文档 - 标准编码[2]

读文件

#!/usr/bin/python3

# 打开文件,逐行读入并打印
filename = 'hello_world.py'
f = open(filename, 'r', encoding='ascii')

print("Contents of " + filename)
print('-' * 30)
for line in f:
    print(line, end='')

f.close()

# 'with'是一种更简单的方式,会自动处理文件关闭
filename = 'while_loop.py'

print("\n\nContents of " + filename)
print('-' * 30)
with open(filename, 'r', encoding='ascii') as f:
    for line in f:
        print(line, end='')
  • 通常默认编码为'UTF-8',这里设定为'ascii'
  • 使用with并设定f为文件句柄是一种习惯
$ ./file_reading.py
Contents of hello_world.py
------------------------------
#!/usr/bin/python3

print("Hello World")


Contents of while_loop.py
------------------------------
#!/usr/bin/python3

# continuously ask user input till it is a positive integer
usr_string = 'not a number'
while not usr_string.isnumeric():
    usr_string = input("Enter a positive integer: ")

如果文件不存在

#!/usr/bin/python3

with open('xyz.py', 'r', encoding='ascii') as f:
    for line in f:
        print(line, end='')
  • 如果文件没有找到会返回错误
$ ./file_reading_error.py
Traceback (most recent call last):
  File "./file_reading_error.py", line 3, in <module>
    with open('xyz.py', 'r', encoding='ascii') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'xyz.py'
$ echo $?
1
  • 使用read()读入整个文件内容为单个字符串
>>> f = open('hello_world.py', 'r', encoding='ascii')
>>> f
<_io.TextIOWrapper name='hello_world.py' mode='r' encoding='ascii'>
>>> print(f.read())
#!/usr/bin/python3

print("Hello World")
  • 逐行读入使用readline()
>>> f = open('hello_world.py', 'r', encoding='ascii')
>>> print(f.readline(), end='')
#!/usr/bin/python3
>>> print(f.readline(), end='')

>>> print(f.readline(), end='')
print("Hello World")

>>> f.close()
>>> print(f.readline(), end='')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file.
  • 使用readlines()读入所有行为列表
    • 注意复数形式
>>> f = open('hello_world.py', 'r', encoding='ascii')
>>> all_lines = f.readlines()
>>> all_lines
['#!/usr/bin/python3\n', '\n', 'print("Hello World")\n']
  • 检查文件是否关闭
>>> f = open('hello_world.py', 'r', encoding='ascii')

>>> f.closed
False

>>> f.close()
>>> f.closed
True

写文件

#!/usr/bin/python3

with open('new_file.txt', 'w', encoding='ascii') as f:
    f.write("This is a sample line of text\n")
    f.write("Yet another line\n")
  • 使用write()方法打印一个字符串到文件
  • 想要添加文本到已存在的文件,使用a模式而不是w模式
$ ./file_writing.py
$ cat new_file.txt
This is a sample line of text
Yet another line

使用fileinput就地编辑

#!/usr/bin/python3

import fileinput

with fileinput.input(inplace=True) as f:
    for line in f:
        line = line.replace('line of text', 'line')
        print(line, end='')
  • 当程序运行时,将被修改的文件都会指定为命令行参数[3]
  • 注意print函数必须用f.write替代
  • 因为迭代的每行已经有换行符,尾部给空字符串
  • Python文档 - fileinput[4]
$ ./inplace_file_editing.py new_file.txt
$ cat new_file.txt
This is a sample line
Yet another line

$ # 要改变当前目录中所有以.txt结尾的文件,使用
$ ./inplace_file_editing.py *.txt

$ # stdin也可以作为输入
$ echo 'a line of text' | ./inplace_file_editing.py
a line
  • 指定文件名和备份扩展
# 在程序内指定文件名
with fileinput.input(inplace=True, files=('file1.txt', 'file2.txt')) as f:

# 要创建一个不修改的文件备份,传入对应的备份参数
with fileinput.input(inplace=True, backup='.bkp') as f:

参考资料

[1]Python文档 - open: https://docs.python.org/3/library/functions.html#open

[2]Python文档 - 标准编码: https://docs.python.org/3/library/codecs.html#standard-encodings

[3]命令行参数: ./Command_line_arguments.md

[4]Python文档 - fileinput: https://docs.python.org/3/library/fileinput.html

本文分享自微信公众号 - 优雅R(elegant-r),作者:王诗翔

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-15

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 「Workshop」第十一期:降维

    前言:主要是从理解降维和用R实现降维这两个层面上来阐述,具体的算法还需要感兴趣的小伙伴另外了解。

    王诗翔呀
  • 「R」MRO装包踩坑记

    前几天开始装MRO后发现一切跟Github的操作都不工作了,比如说使用blogdown::install_hugo()。

    王诗翔呀
  • 「Geek-r」数据导入

    在掌握一定的 R 编程技能后,我们开始迈入数据分析的殿堂。大部分数据分析事务的数据都不是通过 R 创建,而是来自于各种数据收集软硬件、渠道,包括 Excel、网...

    王诗翔呀
  • python处理txt文件常用方法

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家的支持。

    wencheng
  • How to make local changes on your ui5 library file in Eclipse

    You meet with issues when you send odata request to backend:

    Jerry Wang
  • 如何修改SAP UI5本地库文件

    You meet with issues when you send odata request to backend:

    Jerry Wang
  • 18.6.17日报

    原因是页面会reload,而mb会把所有env里的uv的handle全部close。导致vscode的sharp process的有名管道的handleye

    龙泉寺扫地僧
  • TCTF/0CTF2018 XSS Writeup

    刚刚4月过去的TCTF/0CTF2018一如既往的给了我们惊喜,其中最大的惊喜莫过于多道xss中Bypass CSP的题目,其中有很多应用于现代网站的防御思路。...

    Seebug漏洞平台
  • TCTF/0CTF2018 XSS Writeup

    刚刚4月过去的TCTF/0CTF2018一如既往的给了我们惊喜,其中最大的惊喜莫过于多道xss中Bypass CSP的题目,其中有很多应用于现代网站的防御思路。

    Seebug漏洞平台
  • codeforces 509B(构造,思维)

    There are n piles of pebbles on the table, the i-th pile contains a i pebbles. Y...

    dejavu1zz

扫码关注云+社区

领取腾讯云代金券