专栏首页SmartSiPython 文件处理

Python 文件处理

1. csv文件处理

记录中的字段通常由逗号分隔,但其他分隔符也是比较常见的,例如制表符(制表符分隔值,TSV)、冒号、分号和竖直条等。建议在自己创建的文件中坚持使用逗号作为分隔符,同时保证编写的处理程序能正确处理使用其他分隔符的CSV文件。

备注:

有时看起来像分隔符的字符并不是分隔符。通过将字段包含在双引号中,可确保字段中的分隔符只是作为变量值的一部分,不参与分割字段(如...,"Hello, world",...)。

Python的csv模块提供了一个CSV读取器和一个CSV写入器。两个对象的第一个参数都是已打开的文本文件句柄(在下面的示例中,使用newline=’’选项打开文件,从而避免删除行的操作)。必要时可以通过可选参数delimiter和quotechar,提供默认的分隔符和引用字符。Python还提供了控制转义字符、行终止符等定界符的可选参数。

with open("somefile.csv", newline='') as infile:
  reader = csv.reader(infile, delimiter=',', quotechar='"')

CSV文件的第一条记录通常包含列标题,可能与文件的其余部分有所不同。这只是一个常见的做法,并非CSV格式本身的特性。

CSV读取器提供了一个可以在for循环中使用的迭代器接口。迭代器将下一条记录作为一个字符串字段列表返回。读取器不会将字段转换为任何数值数据类型,另外,除非传递可选参数skipinitialspace=True,否则不会删除前导的空白。

如果事先不知道CSV文件的大小,而且文件可能很大,则不宜一次性读取所有记录,而应使用增量的、迭代的、逐行的处理方式:读出一行,处理一行,再获取另一行。

CSV写入器提供writerow()writerows()两个函数。writerow()将一个字符串或数字序列作为一条记录写入文件。该函数将数字转换成字符串,因此不必担心数值表示的问题。类似地,writerows()将字符串或数字序列的列表作为记录集写入文件。

在下面的示例中,使用csv模块从CSV文件中提取Answer.Age列。假设此列肯定存在,但列的索引未知。一旦获得数值,借助statistics模块就能得到年龄的平均值和标准偏差。

首先,打开文件并读取数据:

with open("demographics.csv", newline='') as infile:
  data = list(csv.reader(infile))

检查文件中的第一个记录 data[0] ,它必须包含感兴趣的列标题:

ageIndex = data[0].index("Answer.Age")

最后,访问剩余记录中感兴趣的字段,并计算和显示统计数据:

ages = [int(row[ageIndex]) for row in data[1:]]
print(statistics.mean(ages), statistics.stdev(ages))

csv和statistics模块是底层的、快速而粗糙的工具。在第6章,你将了解如何在更为复杂的项目中使用pandas的数据frame,完成那些比对几列数据进行琐碎的检索要高端得多的任务。

2. Json文件处理

需要注意的一点就是某些Python数据类型和结构(比如集合和复数)无法存储在JSON文件中。因此,要在导出到JSON之前,将它们转换为JSON可表示的数据类型。例如,将复数存储为两个double类型的数字组成的数组,将集合存储为一个由集合的各项所组成的数组。

将复杂数据存储到JSON文件中的操作称为JSON序列化,相应的反向操作则称为JSON反序列化。Python通过json模块中的函数,实现JSON序列化和反序列化。

函数

说明

dump()

将Python对象导出到文件中

dumps()

将Python对象编码成JSON字符串

load()

将文件导出为Python对象

loads()

将已编码的JSON字符串解码为Python对象

备注:

把多个对象存储在一个JSON文件中是一种错误的做法,但如果已有的文件包含多个对象,则可将其以文本的方式读入,进而将文本转换为对象数组(在文本中各个对象之间添加方括号和逗号分隔符),并使用loads()将文本反序列化为对象列表。

Example:

以下代码片段实现了将任意(可序列化的)对象按先序列化、后反序列化的顺序进行处理:

# 将Python对象编码成JSON字符串
data = [{'apple': 23, 'bear': 11, 'banana': 54}]
s = json.dumps(data)
print type(s)  # <type 'str'>
print s  # [{"apple": 23, "bear": 11, "banana": 54}]

# 将Python对象编码成JSON字符串并格式化输出
format_str = json.dumps(data, sort_keys=True, indent=4, separators=(',', ': '))
print format_str
'''
[
    {
        "apple": 23,
        "banana": 54,
        "bear": 11
    }
]
'''

# 将已编码的JSON字符串解码为Python对象
data = '[{"apple": 23, "bear": 11, "banana": 54}]'
o = json.loads(data)
print type(o)  # <type 'list'>
print o[0].get('apple', 0)  # 23

# 将Python对象导出到文件中
data = [{'apple': 23, 'bear': 11, 'banana': 54}]
with open("/home/xiaosi/data.json", "w") as f_dump:
    s_dump = json.dump(data, f_dump, ensure_ascii=False)

# 将文件导出为Python对象
with open("/home/xiaosi/data.json", 'r') as f_load:
    ob = json.load(f_load)
print type(ob)  # <type 'list'>
print ob[0].get('banana')  # 54

备注:

使用JSON函数需要导入json库:import json。

JSON 类型转换到 python 的类型对照表:

JSON

Python

object

dict

array

list

string

unicode

number (int)

int, long

number (real)

float

true

True

false

False

null

None

来自于:

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python文件处理

    很多初学者都没有在程序中写异常的意识,这会给程序带来很多危险,比如程序突然崩溃,攻击者可能会根据traceback对代码发起攻击,一般在涉及到数据交互,输入输出...

    刘开心_1266679
  • python 文件处理

    python 读取一个文件,使用内置函数open() 通过下边的语法可以看到一个函数调用的东西,那就是传参数,如果有关键字指定,那么就写指定的,如果没有就按默认...

    py3study
  • python文件处理

    python中的都是用 open() 函数,调用 open() 函数,应用程序会发起系统调用 open(...) ,进而对文件完成操作~。以下示例均在 pyth...

    py3study
  • Python文件处理

    在python里面我们必不可少的就是要与文件打交道,这个时候我们使用open方法就可以打开或者是创建文件了。可以读取文件内容,也可以写入内容。

    我被狗咬了
  • python文件处理练习

    py3study
  • Python文件处理(持续) 原

    晓歌
  • Python文件处理进阶篇

    昨天文章结尾的时候,我说Python使用seek函数报错:io.UnsupportedOperation:can’t do nonzero end-relati...

    stormwen
  • Python文件处理入门篇

    昨天分享了一个关于文件搜索的小实战项目,其实文件处理是Python里面非常重要的一块内容,知识点很多,Python对本地文件的处理,主要是通过文件的读和写来完成...

    stormwen
  • Python文件处理实用指南

    对文件的操作算是Python中一个基础又重要的知识点了,无论是在爬虫、数据分析、Web开发,还是在编写图形界面、进行数据分析,都有可能需要用到文件相关的操作。

    州的先生

扫码关注云+社区

领取腾讯云代金券