说真的,刚开始接触数据这块儿,看到一堆后缀是 .csv
的文件躺在那里,心就有点慌。特别是在 Windows 上,用 Excel 打开吧,数据量稍微大点就卡得动不了,更别提那恼人的乱码问题了。那时候就在想,就没有更“技术”一点、更稳妥一点的办法吗?当然有啊!对于我们用 Python 搞事情的人来说,处理 csv 文件简直是基本功,而且方法还不止一种,各有各的好处。今天就掰开了、揉碎了,跟你聊聊 Python怎么打开csv 这码事儿。
首先得明白, csv 文件本质上就是个纯文本文件,数据 之间通常是用逗号隔开(Comma Separated Values嘛),但也可以是别的符号,比如制表符、分号啥的。每一行就是一条记录,每条记录里面的字段用分隔符隔开。理解了这个,就知道为啥有时候直接用记事本打开也能看,就是结构有点乱。
好,言归正传,用 Python 打开 csv 文件,最常见也最基础的,就是用它自带的那个 csv模块。这个模块是 Python 的“内建”功能,不用额外安装什么,非常方便。
方法一:用 Python 内置的 csv 模块
这个模块提供了一些工具,让你能更规范地读取和写入 csv 文件,而不用自己去费劲地拆分每一行的字符串。
最简单的读取方式是使用 csv.reader
。想象一下,它就像一个“读取器”,逐行扫描你的 csv 文件,然后把每一行按分隔符切好,变成一个列表(list)。
来,看看代码怎么写:
“`python
import csv
file_path = ‘your_data.csv’ # 替换成你的csv文件路径
try:
# 关键点:指定文件路径,读取模式 ‘r’,还有编码 encoding=’utf-8’
# 如果你的文件不是 utf-8 编码,这里要换成对应的,比如 ‘gbk’
# newline=” 这个也很重要,能防止读取时出现额外的空行
with open(file_path, mode=’r’, encoding=’utf-8′, newline=”) as csvfile:
# 创建一个 reader 对象
reader = csv.reader(csvfile)
# 如果你的csv文件第一行是表头,通常会先跳过它
# next(reader) # 跳过第一行表头
print(f"开始读取文件:{file_path}")
# 遍历 reader,每一行就是一个列表
for row in reader:
# row 现在是一个列表,包含了这一行的所有数据
print(row)
# 你可以按索引访问每个字段,比如 row[0], row[1] 等等
# print(f"第一列数据: {row[0]}, 第二列数据: {row[1]}")
except FileNotFoundError:
print(f”错误:文件 ‘{file_path}’ 未找到。”)
except Exception as e:
print(f”读取文件时发生错误:{e}”)
print(“文件读取完毕。”)
“`
看到了吗?with open(...) as csvfile:
这是一种特别优雅的处理文件的方式,它能确保文件在用完后自动关闭,即便中间程序报错了也一样,避免资源泄露。模式 'r'
表示我们是来读取文件数据的。encoding='utf-8'
这个太重要了!国内很多 csv 文件可能是 gbk
或 gb2312
编码,但现在越来越多的是 utf-8
了,utf-8
是国际通用标准,强烈推荐。如果不知道编码,有时候得试一下。newline=''
呢,是为了避免在某些操作系统上读取 csv 文件时出现奇怪的空行,这是 csv模块 官方推荐的做法。
csv.reader(csvfile)
就是创建了那个“读取器”。然后 for row in reader:
循环,每次给你一行 数据,这行 数据 已经被切好,乖乖地装在一个列表里等着你处理了。你可以用列表的索引 row[0]
, row[1]
这样去访问每一列的数据。
但是呢,用索引访问有个问题,你得记住第一列是什么、第二列是什么……字段多了就容易晕。有没有更“智能”一点的办法呢?有! csv模块 还有一个好用的工具叫 csv.DictReader
。
csv.DictReader
更适合那种带表头的 csv 文件。它会把第一行当做表头,然后后续每一行的数据不再是列表,而是字典(dictionary)!字典的键就是表头里的字段名,值就是对应列的数据。这样你就可以用列名去访问数据了,比如 row['姓名']
、row['年龄']
,是不是一下子清晰了很多?
来看 DictReader
的例子:
“`python
import csv
file_path = ‘your_data_with_header.csv’ # 替换成你的csv文件路径,这个文件要有表头哦
try:
with open(file_path, mode=’r’, encoding=’utf-8′, newline=”) as csvfile:
# 创建一个 DictReader 对象
# 它会自动使用第一行作为字典的键(fieldnames)
reader = csv.DictReader(csvfile)
print(f"开始使用 DictReader 读取文件:{file_path}")
# DictReader 也是可迭代的,每次循环得到一个字典
for row in reader:
# row 现在是一个字典
print(row)
# 你可以用列名访问数据,前提是文件有表头且 DictReader 正确读取了
# 比如,如果你的表头里有 '姓名' 和 '城市'
# print(f"姓名: {row['姓名']}, 城市: {row['城市']}")
# 访问不存在的键会报错,可以先判断是否存在或者用 row.get()
except FileNotFoundError:
print(f”错误:文件 ‘{file_path}’ 未找到。”)
except KeyError as e:
print(f”读取文件时发生错误:找不到指定的列名 {e},请检查文件表头。”)
except Exception as e:
print(f”读取文件时发生错误:{e}”)
print(“文件读取完毕。”)
“`
看到没?csv.DictReader(csvfile)
就搞定了。后续遍历 reader
拿到的 row
直接就是字典了。用起来感觉舒服多了,代码也更“语义化”了。
csv模块 还有个参数 delimiter
,可以指定分隔符。比如你的文件是用分号 ;
分隔的,那就 csv.reader(csvfile, delimiter=';')
或 csv.DictReader(csvfile, delimiter=';')
。这个小细节在处理非标准 csv 文件时非常有用。
总的来说, csv模块 是 Python 内置的,够用,适合那些简单、数据量不大的 csv 文件处理任务。它的优点是轻量级,不用额外安装。缺点嘛,就是处理起来有点“手工”,特别是后续如果需要对 数据 做筛选、排序、计算之类的操作,用 csv模块 读出来的列表或字典,你得自己写一大堆循环和判断逻辑,会比较麻烦。
方法二:祭出神器——使用 pandas 库
好家伙,如果你是搞数据分析、数据科学的,或者需要处理的 csv 文件稍微大一点、复杂一点,那么 pandas 库绝对是你的不二之选。毫不夸张地说, pandas 就是为了处理表格型 数据 而生的, csv 文件正是它最拿手的对象之一。
Python怎么打开csv 文件用 pandas ?简单到令人发指!安装?第一次用的话,打开你的命令行(Terminal 或 CMD),敲下这句魔法咒语:pip install pandas openpyxl
(openpyxl
是为了以后读写Excel文件,顺手装上不亏)。
安装好了,导入 pandas,然后一行代码就能把 csv 文件的内容变成一个 DataFrame(DataFrame 可以理解成一个带行列索引的二维表格,就像数据库的表或者 Excel 工作表)。
“`python
import pandas as pd
file_path = ‘your_large_data.csv’ # 替换成你的csv文件路径
try:
# 核心中的核心:pd.read_csv()
# 它会自动判断很多东西,比如分隔符、有没有表头、数据类型等等
# encoding 参数同样重要,但 pd.read_csv 会尝试多种编码,不过最好还是明确指定
# usecols 参数可以指定只读取哪些列,省内存
# dtype 参数可以指定某些列的数据类型,避免误判
df = pd.read_csv(file_path, encoding=’utf-8′) # 默认分隔符是逗号
print(f"使用 pandas 读取文件:{file_path}")
print("\nDataFrame 的前5行:")
print(df.head()) # 看看读进来的数据长啥样,默认显示前5行
print("\nDataFrame 的信息概览:")
df.info() # 查看列名、非空值数量、数据类型等信息
print("\nDataFrame 的描述性统计(数值列):")
print(df.describe()) # 查看数值列的统计信息,如均值、中位数、标准差等
# 现在 df 就是你的数据了,你可以非常方便地进行后续操作
# 比如:
# print("\n只看某一列的数据:")
# print(df['某列名']) # 替换 '某列名' 为实际列名
# print("\n筛选数据,比如年龄大于30的:")
# print(df[df['年龄'] > 30]) # 替换 '年龄' 和 30 为实际条件
except FileNotFoundError:
print(f”错误:文件 ‘{file_path}’ 未找到。”)
except Exception as e:
print(f”使用 pandas 读取文件时发生错误:{e}”)
print(“pandas 文件读取及初步查看完毕。”)
“`
看到了吧,一行 pd.read_csv()
,几乎搞定了所有 csv模块 需要你手动处理的事情:文件打开、关闭、按分隔符切分、处理表头(它默认第一行就是表头),甚至还能自动识别 数据 的类型(数字、文本、日期等)。而且它返回的是 DataFrame 对象,这东西简直太强大了!有了 DataFrame,你想对 数据 做任何操作,几乎都有对应的内置方法,语法非常简洁高效。什么筛选(比如 df[df['age'] > 18]
)、排序(df.sort_values('salary')
)、分组聚合(df.groupby('city')['sales'].sum()
)……跟用 csv模块 读出来的列表然后自己写循环比,那效率和代码量简直是天壤之别。
pd.read_csv()
方法本身也有巨多参数,可以让你精细控制读取过程。比如 delimiter
参数用来指定分隔符(跟 csv模块 一样),header
参数可以指定哪一行是表头(或者有没有表头),names
参数可以给没有表头的文件指定列名,skiprows
跳过前面几行,nrows
只读取前面几行,na_values
指定哪些值应该被认为是缺失值(NaN),dtype
强制指定某些列的 数据 类型……参数多得记不住没关系,用到的时候查文档就行,核心就是它帮你把大部分繁琐的事儿都做了。
对于很大的 csv 文件, pandas 还能分块读取(chunking),用 chunksize
参数,这样就不会一次性把所有 数据 都加载到内存,避免内存爆炸。这点对于处理TB级别 数据 的时候特别有用。
总结一下,Python怎么打开csv,你有两种主要选择:
- csv模块: 内置的,轻量级,适合简单任务或不依赖第三方库的场景。读取结果是列表的列表或字典的列表。
- pandas库: 需要安装,功能强大,高效,特别是处理大型 数据 和需要后续复杂分析时。读取结果是 DataFrame 对象。
选哪个?看你的需求和场景。如果只是简单看看文件内容、做个简单遍历处理, csv模块 足够了。但只要你的任务跟数据分析、数据清洗、或者数据量稍微大点沾边,毫不犹豫选 pandas 的 pd.read_csv
吧!它能大幅提升你的效率,写出来的代码也更清晰易懂。
别再盯着那些 csv 文件发愁了,掌握了 Python怎么打开csv 的这两板斧,你就能轻松把这些原始 数据 抓到手里,变成可以分析、可以利用的信息财富了!去试试吧,你会爱上这种用代码驾驭数据的感觉!
评论(0)