文件的两种操作方式
①使用open()方法
Python open()方法用于打开一个文件,并返回文件对象。 在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出OSError。
注意:使用open()方法一定要保证关闭文件对象,即调用close()方法。
open()函数常用形式是接收两个参数:文件名(file)和模式(mode)。
②使用with语句
使用with语句打开文件有几个重要的好处:
自动关闭文件: with语句创建了一个上下文管理器,确保在代码块执行结束时自动关闭文件。这样可以避免忘记手动关闭文件的错误,同时确保及时释放资源。
异常处理: with语句在文件操作中提供了异常处理的机制。如果在文件操作过程中发生异常,with语句会确保文件被正确关闭,防止文件资源泄漏。
简化代码结构: 使用with语句可以简化代码结构,避免显式地调用close方法。这使得代码更加清晰和易读。
Python内置的csv模块
Python内置了一个csv模块,该模块提供了用于读取和写入CSV文件的功能。CSV(Comma-Separated Values)是一种简单的文本格式,其中数据字段由逗号或其他分隔符分隔。
以下是csv模块的一些主要功能:
- csv.reader: 用于读取CSV文件。可以指定不同的分隔符,如逗号、制表符等。
- 语法:
csv.reader(csvfile, delimiter=',', dialect='excel', **fmtparams)
csvfile: 一个打开的文件对象或者支持迭代的对象(例如,文件的每一行作为一个字符串元素的列表)。
delimiter: 可选参数,用于指定 CSV 文件中字段之间的分隔符。默认为逗号 ,。
dialect: 可选参数,用于指定 CSV 文件的方言(例如,CSV 文件使用的分隔符等)。如果未指定,默认为 ‘excel’。
fmtparams: 可选的关键字参数,用于覆盖方言的一些参数设置。
import csv
with open('data.txt', 'r') as file:
csv_reader = csv.reader(file)
for row in csv_reader: #读取一行数据,以逗号进行分隔
print(row) #返回一个列表
- csv.writer: 用于写入CSV文件。同样,可以指定分隔符。
import csv
data = [['Name', 'Age', 'City'],
['John', 25, 'New York'],
['Alice', 30, 'San Francisco'],
['Bob', 22, 'Los Angeles']]
with open('example.csv', 'w', newline='') as file:
csv_writer = csv.writer(file)
csv_writer.writerows(data)
- csv.DictReader和csv.DictWriter: 这两个类用于读取和写入字典形式的数据,其中字典的键通常是CSV文件中的列标题。
- 语法:
csv.DictWriter(csvfile, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)
- csvfile: 一个打开的文件对象或者支持写入的对象。
fieldnames: 一个包含字典键的列表,指定 CSV 文件的列顺序和列标题。
restval: 可选参数,用于指定字典中缺少的键对应的默认值。默认为空字符串 ‘’。
extrasaction: 可选参数,指定在写入字典时,是否忽略额外的键(‘ignore’),将其视为错误(‘raise’)或将其添加到输出中(‘write’)。
dialect: 可选参数,用于指定 CSV 文件的方言(例如,CSV 文件使用的分隔符等)。如果未指定,默认为 ‘excel’。
*args 和 **kwds: 其他可选的位置参数和关键字参数,用于配置方言的其他参数。
import csv
with open('example.csv', 'r') as file:
csv_reader = csv.DictReader(file)
for row in csv_reader:
print(row)
data = [{'Name': 'John', 'Age': 25, 'City': 'New York'},
{'Name': 'Alice', 'Age': 30, 'City': 'San Francisco'},
{'Name': 'Bob', 'Age': 22, 'City': 'Los Angeles'}]
with open('example.csv', 'w', newline='') as file:
fieldnames = ['Name', 'Age', 'City']
csv_writer = csv.DictWriter(file, fieldnames=fieldnames)
csv_writer.writeheader() #写入标题行
csv_writer.writerows(data) #写入字典数据
假设有一个文本文件data.txt内容如下:
Name, Age, City
John, 25, New York
Alice, 30, San Francisco
Bob, 28, Los Angeles
方法一:使用标准的文件读写操作
# 读取文本文件内容 输出到CSV文件
with open('data.txt', 'r') as fi, open('data.csv', 'w', newline='') as fo:
# 逐行读取txt文件
for line in fi:
# 假设txt文件中的字段是由逗号和空格分隔的
fields = line.strip().split(', ')
# 将字段以逗号分隔写入csv文件
fo.write(','.join(fields) + '\n')
总结:
newline=''
参数的作用:
在使用open函数打开文件时,newline='‘参数是为了确保在不同操作系统上正确处理换行符。
在Windows系统上,文本文件的行尾通常由两个字符组成:回车符(\r)和换行符(\n),即"\r\n"。而在类Unix 系统(如Linux和macOS)上,行尾只使用换行符(\n),即"\n"。
在Python中,open函数默认使用操作系统的默认行尾符号。然而,CSV格式通常期望行尾符是\n,而不是\r\n。如果不使用newline=’‘参数,可能会导致在某些情况下生成的CSV文件在不同平台上的行尾符不一致,可能会引起问题。
因此,使用newline=’'参数可以确保在写入CSV文件时,Python会统一使用\n作为行尾符,从而避免潜在的问题。这样做是为了提高跨平台兼容性。
方法二:使用内置的csv模块
import csv
with open('data.txt', 'r') as fi, open('data.csv', 'w', newline='') as fo:
# 使用CSV读取器逐行读取txt文件
csv_reader = csv.reader(fi)
# 创建CSV写入器
csv_writer = csv.writer(fo)
# 将每一行的内容写入CSV文件
for row in csv_reader:
csv_writer.writerow(row) #writerow()方法是csv.writer对象的一个方法,用于将一行数据写入文件。
方法三:使用pandas库
import pandas as pd
# 使用pandas读取txt文件
df = pd.read_csv('data.txt', delimiter=', ')
# 将数据写入csv文件
df.to_csv('data.csv', index=False)