wps保存的csv文件是什么编码的_Python文件读写详解.md

  • open函数参数解析
    • mode 打开模式
    • buffering 缓冲区
      • 什么是缓冲区?
      • 如何查看系统默认缓冲区大小?
      • 为什么默认缓冲区是4K?
      • 测试缓冲区
      • 如何修改缓冲区?
    • encoding 编码格式
    • errors 报错级别 不能用于binary mode
    • newline 设置换行符, 默认为none
      • 不同操作系统换行符不统一
      • 使用newline
    • 文件方法调用
      • read 读文件
      • readline 读一行
      • readlines
      • write 写文件
      • writelines 把可迭代对象写入文件
      • flush
      • tell
      • readable
      • writeable
      • isatty
      • seek
      • fileno

open函数参数解析

  • open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
  • file : 一个包含了你要访问的文件名称的字符串值。

mode 打开模式

决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。默认文件访问模式为只读(r)。

7f946d8b717e7b409c7d463fa0eab299.png

buffering 缓冲区

设置文件缓冲区大小,默认值为系统默认缓冲区大小。open 函数对文件 buffer 的设置是对系统调用的封装,并不是 Python 本身实现的,而是系统 API 中早已提供的

什么是缓冲区?

  • 因为磁盘的IO是很耗时的,设置缓冲区为了减少IO读写次数。例如每次向磁盘写入1kb字符,如果缓冲区大小大于1kb,这个时候不会立刻写入磁盘,而是等缓冲区满了之后再次写入。
  • 如果一次写入内容大于缓冲区大小,则会立即写入。如果不 close,或者不提前用 flush 是不会刷入硬盘的

如何查看系统默认缓冲区大小?

在多数系统里面,默认缓冲区大小为4094(4k),8192(8k)。

import 

为什么默认缓冲区是4K?

操作系统通常系统有一个磁盘最小读写单位,逻辑块(block),linux里面是4k。 e.g: ```shell script sudo /sbin/tune2fs -l /dev/nvme0n1p2 First block: 0 Block size: 4096

### 测试缓冲区
这个例子将缓冲区修改为2,这样每次都会去写磁盘,造成效率低下。
```python
with open("test.txt", "wb+", buffering=2) as f:
    for num in range(1, 1000000):
        f.write(b"tn")

如何修改缓冲区?

对于不同参数(-1, 0, 1, > 1),不同类型的文件 (Binary/Text) 还有不同的策略

| File Type | buffering=-1 | buffering=0| buffering=1 | buffering>1 | | ---- | ---- | ---- | ---- | ---- | | Binary | 系统默认的 buffer 大小 | unbuffered | 1| 指定缓冲区大小 | Text | 系统默认的 buffer 大小 | 不允许 | line buffering | 系统默认的 buffer 大小

encoding 编码格式

这个参数应该被用于text模式,默认编码是系统设置。

errors 报错级别 不能用于binary mode

  • strict: 字符编码出现问题时会报错
  • ignore: 字符编码出现问题时程序会忽略而过,继续执行下面的程序

newline 设置换行符, 默认为none

newline 的值可以为 None, '', 'n', 'r', and 'rn'

不同操作系统换行符不统一

  • linux/mac:n
  • windows:rn universal newlines - 系统换行符

使用newline

dadce9ab1c8a1dc1655c1b31cdaf8bd4.png
  • 若文件都是使用python程序进行读写,一般使用默认值即可
  • newline="" 的例子。使用csv模块读写CSV文件时候,需要设置newline='' 参考文档:https://docs.python.org/3.4/library/csv.html?highlight=csv

例子:

# 强制转化成r 写入

输出

['r', 'r', 'r', 'r']
['n', 'n', 'n', 'n']

文件方法调用

read 读文件

默认把整个文件当成一个字符串读出来,可以传入参数设置一次性读出来的字符长度

readline 读一行

一次读一行,以换行符作为分界点,每次调用之后文件指针指向下一行

readlines

默认把整个文件当成一个list读出来,以换行符作为元素分隔,可以传入参数设置一次性读出来的列表长度。需要注意是列表每个元素包涵所有内容,换行符不会被转义。

write 写文件

把一个字符写入文件

writelines 把可迭代对象写入文件

可迭代对象包括字符串,列表,元祖 需要注意是,writelines传入的是一个可迭代对象类型,如果传入一个字符串,会遍历这个字符串每个字符,然后再写入,如果字符串很大,会造成效率极其低下。一个长字符串写入,应该采用write方法

flush

刷新缓冲区,如果缓冲区还没有写满,则可以强制刷新,写入磁盘。

tell

返回当前指针位置

readable

判断当前文件是否可以读,返回bool值

writeable

判断当前文件是否可以写,返回bool值

isatty

判断当前文件是否被打开,并且连接到了一个类终端(TTY)设备。具体用法参考open_function_issatty.py

seek

  • offset 开始的偏移量,也就是代表需要移动偏移的字节数
  • whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

fileno

返回整型的文件描述符.如果IO对象不能使用文件描述符,SError异常被抛出。

文章相关代码:

https://github.com/Danielyan86/study-notes/tree/master/Linux/filesystem​github.com
f24f09bcd4a76fd2ce618c59f18d56d8.png
解释下Peoplesoft的这段代码 Component array of array of any &tmpArray; Local Record &rec1, &rec2; &rec1 = CreateRecord(Record.HIK_IPSANRS_TBL); &rec2 = CreateRecord(Record.HIK_IPSAN_TBL); Local Rowset &rsLvl1, &rsDtl; Local number &i, &j; Local Row &row; &rsLvl1 = GetLevel0()(1).GetRowset(Scroll.WPS_STR_INF_TBL); For &i = 1 To &rsLvl1.ActiveRowCount &rsDtl = &rsLvl1(&i).GetRowset(Scroll.WPS_STR_DTL_TBL); For &j = 1 To &rsDtl.ActiveRowCount &row = &rsDtl(&j); If Not &row.IsDeleted Then If All(&row.WPS_STR_DTL_TBL.WPS_GP_AMT_ID.Value) Then &rec1 = CreateRecord(Record.WPS_IPSANRS_TBL); &rec1.WPS_GP_AMT_ID.Value = &row.WPS_STR_DTL_TBL.WPS_GP_AMT_ID.Value; &rec1.EFFDT.Value = &row.WPS_STR_DTL_TBL.EFFDT.Value; If &rec1.SelectByKey() Then &rec1.WPS_GP_AMT_ID.Value = &row.WPS_STR_DTL_TBL.WPS_GP_AMT_ID.Value; &rec1.EFFDT.Value = &row.WPS_STR_DTL_TBL.EFFDT.Value; &rec1.STATUS.Value = &rsLvl1(&i).WPS_STR_INF_TBL.STATUS.Value; &rec1.Update(); Else &rec1.WPS_GP_AMT_ID.Value = &row.WPS_STR_DTL_TBL.WPS_GP_AMT_ID.Value; &rec1.EFFDT.Value = &row.WPS_STR_DTL_TBL.EFFDT.Value; &rec1.STATUS.Value = "A"; &rec1.Insert(); End-If; &rec2 = CreateRecord(Record.WPS_IPSAN_TBL); &rec2.WPS_GP_AMT_ID.Value = &row.WPS_STR_DTL_TBL.WPS_GP_AMT_ID.Value; &rec2.EFFDT.Value = &row.WPS_STR_DTL_TBL.EFFDT.Value; &rec2.WPS_STORID.Value = &row.WPS_STR_DTL_TBL.WPS_STORID.Value; &rec2.WPS_GP_WAGECODE.Value = &row.WPS_STR_DTL_TBL.WPS_GP_WAGECODE.Value; If Not &rec2.Insert() Then &rec2.Update(); End-If; End-If; End-If; End-For; End-For;
最新发布
06-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值