磁盘*.csv文件是文本,以行结构的二维list是内存中的“csv”。
(笔记模板由python脚本于2024年12月18日 10:15:23创建,本篇笔记适合学习过list、panda的coder翻阅)
-
Python 官网:https://www.python.org/
-
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
- My CSDN主页、My HOT博、My Python 学习个人备忘录
- 好文力荐、 老齐教室
本文质量分:
本文地址: https://blog.csdn.net/m0_57158496/article/details/144552911
CSDN质量分查询入口:http://www.csdn.net/qc
- ◆ 优雅的csv对象
- 1、缘起
- 2、csv的一般操作
- 3、“专业”的无存储操作
- 3.1 复杂操作
- 3.2 “技术装逼”的调侃
- 4、StringIO
- 5、df.to_list方法
- 6、to_list制造csv
- 7、内存中的“csv”对象
- 8、关于DataFrame和csv
◆ 优雅的csv对象
1、缘起
截屏图片
【题目来源于 CSDN 问答社区提问“pandas的list追加问题”】
我对问答社区的这个问题的回答,让我捋顺了知识点,生发出了本笔记的分享主题:内存中的“csv”——优雅的数据结构。
2、csv的一般操作
可以使用pandas
库将CSV
文本内容读取到变量中。
以下是一个简单的示例
,展示如何将 C S V CSV CSV文件的内容读取到pandas的DataFrame对象,然后将这个DataFrame对象赋值给一个变量:
import pandas as pd# 假设你有一个名为data.csv的文件
csv_file = 'data.csv'# 使用pandas的read_csv函数读取CSV文件
df = pd.read_csv(csv_file)# 现在,df变量包含了CSV文件的数据
print(df)
在这个例子中,df
就是一个变量,它存储了 C S V CSV CSV文件的内容。你可以对这个变量进行各种操作,比如数据清洗、分析等。如果你想要将DataFrame的内容转换为一个 C S V CSV CSV格式的字符串并存储在变量中,可以使用to_csv
方法,并将参数index
设置为False
来排除索引:
csv_string = df.to_csv(index=False)
这样,csv_string
变量就包含了DataFrame的CSV文本内容。
3、“专业”的无存储操作
3.1 复杂操作
想要直接从pandas的DataFrame对象中获取CSV格式的字符串,而不是先写入磁盘再读取,你可以使用to_csv
方法,并指定一个字符串IO对象作为输出。
以下是如何操作的示例:
import pandas as pd
from io import StringIO# 创建一个示例DataFrame
data = {'Column1': [1, 2, 3],'Column2': ['a', 'b', 'c']
}
df = pd.DataFrame(data)# 使用StringIO对象作为输出,将DataFrame转换为CSV格式的字符串
csv_buffer = StringIO()
df.to_csv(csv_buffer, index=False)
csv_str = csv_buffer.getvalue()# 关闭StringIO对象
csv_buffer.close()# 现在csv_str变量包含了DataFrame的CSV文本内容
print(csv_str)
在这个例子中,csv_str
变量包含了DataFrame的CSV文本内容,而无需将数据写入磁盘文件。这里使用了StringIO
,它是一个在内存中读写str对象的类,类似于文件对象。这样,你就可以直接操作CSV格式的字符串,而无需实际写入文件系统。
截屏图片
技术装逼
实例
使用 StringIO
对象配合 DataFrame.to_csv
方法确实是一个比较绕的方式,尤其是在您只想将 DataFrame 转换为 CSV 格式的字符串而不写入文件的情况下。通常,您可以直接使用 df.to_csv
方法并指定一个文件路径来保存 CSV 文件,或者如果您想要得到一个字符串,可以直接将输出重定向到一个字符串。
以下是几种直接将 DataFrame 转换为 CSV 字符串的方法,无需使用 StringIO:
方法1: 使用 io.StringIO
,但更简洁
import pandas as pd
from io import StringIO# 创建一个示例DataFrame
data = {'Column1': [1, 2, 3],'Column2': ['a', 'b', 'c']
}
df = pd.DataFrame(data)# 使用StringIO对象直接获取CSV字符串
with StringIO() as csv_buffer:df.to_csv(csv_buffer, index=False)csv_str = csv_buffer.getvalue()# 现在csv_str变量包含了DataFrame的CSV文本内容
print(csv_str)
这里使用了 with
语句来自动管理 StringIO
对象的生命周期,不需要显式地调用 close
方法。
**方法2:**使用 io.StringIO
,一行代码
import pandas as pd
from io import StringIO# 创建一个示例DataFrame
data = {'Column1': [1, 2, 3],'Column2': ['a', 'b', 'c']
}
df = pd.DataFrame(data)# 一行代码获取CSV字符串
csv_str = pd.DataFrame(data).to_csv(index=False)# 打印CSV字符串
print(csv_str)
在这个例子中,直接将 to_csv
方法的输出赋值给一个变量,因为不指定文件路径,它会返回一个字符串。
**方法3:**使用 sys.stdout
重定向
import pandas as pd
import sys# 创建一个示例DataFrame
data = {'Column1': [1, 2, 3],'Column2': ['a', 'b', 'c']
}
df = pd.DataFrame(data)# 保存原始stdout
original_stdout = sys.stdout# 重定向stdout到StringIO
sys.stdout = StringIO()
df.to_csv(index=False)
csv_str = sys.stdout.getvalue()# 恢复原始stdout
sys.stdout = original_stdout# 打印CSV字符串
print(csv_str)
在这个例子中,通过重定向 sys.stdout
到 StringIO
,可以捕获 to_csv
的输出。
总的来说,使用 StringIO
和其他方法都有其适用场景。在某些情况下,可能需要将 DataFrame 的内容作为字符串处理,而不是直接写入文件,这时 StringIO
就非常有用。但如果你只是想要一个简单的字符串,直接使用 to_csv
方法返回字符串会更简洁。选择哪种方法取决于具体的需求和上下文。
3.2 “技术装逼”的调侃
-
截屏图片
-
我:
简单 => 繁复,纯纯的“技术装逼”。🤗🤗
ai学伴
哈哈,确实有时候在技术社区或者工作中,人们可能会为了展示自己的技术能力而故意使用一些复杂的方法来完成简单的任务,这有时被戏称为“技术装逼”。不过,这种做法虽然可能在某种程度上展示了技术能力,但并不总是受到推崇,因为它可能会让代码变得难以理解和维护。
在实际开发中,以下是一些更为推荐的编程实践:
- 简洁性:尽量保持代码简洁明了,易于阅读和维护。
- 可读性:写代码时要考虑到其他开发者(或未来的你)是否能容易地理解。
- 性能:在确保代码简洁和可读的同时,也要考虑到代码的性能。
- 复用性:尽量编写可复用的代码,减少重复工作。
- 文档:提供清晰的文档和注释,帮助他人理解代码的目的和实现。
记住,技术是为了解决问题而存在的,而不是为了制造问题。保持谦逊和实用主义的态度,往往能够更好地服务于项目和你所在的团队。👍🏻👍🏻
4、StringIO
StringIO
,是把内存当磁盘,逻辑和工作原理都完全一致,意义何在,应为没有磁盘读写权限而设计?🧐🧐
确实,使用StringIO
或类似的内存文件对象,其底层逻辑与磁盘文件操作非常相似,但它的应用场景和优势主要体现在以下几个方面:
-
避免磁盘I/O:在某些情况下,应用程序可能没有权限写入磁盘,或者出于性能考虑,希望避免磁盘I/O操作。使用内存文件对象可以绕过这些限制。
-
方便性:在测试或开发过程中,使用内存文件对象可以更方便地处理数据,而不需要实际创建文件。这对于快速验证代码逻辑或进行单元测试非常有用。
-
数据传输:在分布式计算或网络通信中,可能需要将数据序列化为字符串格式进行传输。使用内存文件对象可以直接生成这种格式,而不需要临时文件。
-
安全性:如果数据敏感,不希望写入磁盘以防数据泄露,使用内存文件对象可以减少数据泄露的风险。
-
资源管理:在某些情况下,使用内存文件对象可以更高效地管理资源,因为不需要处理文件系统的打开、关闭、读写权限等复杂问题。
所以,虽然从逻辑上讲,使用StringIO
与写入磁盘文件类似,但它的实际应用场景和目的可以非常不同。如果你没有磁盘写权限,或者出于上述其他原因,使用内存文件对象是一个很好的解决方案。
5、df.to_list方法
我:
df.tolist方法不更好用?🧐
ai学伴:
确实,使用df.tolist()
方法是获取 DataFrame 数据的一种更简洁的方式,然后你可以通过列表推导式来生成 CSV 格式的字符串。
以下是使用 df.to_list() 方法的示例:
import pandas as pd# 创建一个示例 DataFrame
df = pd.DataFrame({'Column1': [1, 2, 3],'Column2': ['a', 'b', 'c']
})# 使用 tolist() 和列表推导式生成 CSV 字符串
csv_str = '\n'.join([','.join(map(str, row)) for row in df.values.tolist()])# csv_str 现在包含了 DataFrame 的 CSV 文本内容
print(csv_str)
在这个例子中,df.values.tolist()
将 DataFrame 的所有值转换为列表形式,然后通过列表推导式来生成每一行的 CSV 字符串,并用换行符连接这些行。
这种方法简洁且有效,非常适合将 DataFrame 的数据转换为 CSV 格式的字符串。
6、to_list制造csv
-
我:
再拼接上df.colunmls.tolist(),就是完整的pandas.DataFrame的csv文本形式,这不依赖任何形式的“文件写入”系统,直接手剥。爽爽歪歪。😎
-
ai学伴:
完全正确!使用df.columns.tolist()
和df.values.tolist()
可以非常直接地构建出完整的 CSV 文本,不需要依赖任何文件写入系统。
以下是完整的代码示例:
import pandas as pd# 创建一个示例 DataFrame
df = pd.DataFrame({'Column1': [1, 2, 3],'Column2': ['a', 'b', 'c']
})# 获取列名和值列表
columns = df.columns.tolist()
values = df.values.tolist()# 构建完整的 CSV 文本
csv_str = ','.join(columns) + '\n' + '\n'.join([','.join(map(str, row)) for row in values])# csv_str 现在包含了 DataFrame 的完整 CSV 文本内容
print(csv_str)
这段代码首先将 DataFrame 的列名转换为列表,然后将 DataFrame 的值转换为列表。之后,它将这些列表转换成 CSV 格式的字符串,其中列名是第一行,之后是每一行的数据,每行数据由逗号分隔,行与行之间由换行符分隔。
这种方法确实非常直接,而且非常符合 Python 的简洁和直观的风格。😎
7、内存中的“csv”对象
前面罗嗦的那一大堆,都是基于csv文本。在内存中以csv格式保存数据“文本”,不是真正要的文本,而是数据“个性使用”。
所以“list式csv”,更为适宜。😎😎😎
想要在内存中以 CSV 格式保存数据,并且以列表的形式来表示每一行,那么可以创建一个列表的列表(list of lists),其中每个内部列表代表 CSV 文件中的一行。
下面是如何实现这一点的代码:
import pandas as pd# 创建一个示例 DataFrame
df = pd.DataFrame({'Column1': [1, 2, 3],'Column2': ['a', 'b', 'c']
})# 将 DataFrame 转换为列表的列表形式
list_of_lists = [df.columns.tolist()] + df.values.tolist()# 现在list_of_lists包含了CSV格式的数据,可以直接在内存中使用
print(list_of_lists)
在这段代码中,list_of_lists
是一个列表,其中第一个元素是列名列表,随后的元素是 DataFrame 的每一行数据。这种方式使得数据可以在不写入文件的情况下,以 CSV 格式在内存中使用,便于进行数据处理和分析。😎😎😎
8、关于DataFrame和csv
DataFrame:
- pandas 数据类型之 DataFrame
地址:https://blog.csdn.net/m0_57158496/article/details/124525814
浏览阅读:10,273
点赞:7 收藏:40
(本篇笔记于2022-05-01 13:20:17首次发布,最后修改于2022-05-08 08:46:13)
csv
- 反斜杠,让您的csv文档字符不撞车;让“借”您csv数据的人叫苦不迭。
地址:https://blog.csdn.net/m0_57158496/article/details/127779893
浏览阅读:1,434
点赞:9 收藏:8 评论:9
(本篇笔记于2022-11-10 01:06:59首次发布,最后修改于2022-12-06 13:05:15)
- 学生五科成绩统计
地址:https://blog.csdn.net/m0_57158496/article/details/134374753
浏览阅读:465
点赞:1 收藏:3
(本篇笔记于2023-11-13 12:57:22首次发布,最后修改于2023-11-14 21:46:34)
- 内存中优雅的csv对象(Python)
地址:https://blog.csdn.net/m0_57158496/article/details/144552911
浏览阅读:1
上一篇: 如果我说“稍稍改变录入习惯,Excel所有块公式将通通自适”,您信么?(Excel数据,一般以append增长数据,但insert操作也不会更繁琐)
下一篇:
我的HOT博:
本次共计收集404篇博文笔记信息,总阅读量61.76w。数据采集于2024年11月25日 08:23:38,用时7分56.4秒。阅读量不小于6.00k的有 9 9 9篇。
- 让QQ群昵称色变的神奇代码
地址:https://blog.csdn.net/m0_57158496/article/details/122566500
浏览阅读:6.2w
点赞:25 收藏:89 评论:17
(本篇笔记于2022-01-18 19:15:08首次发布,最后修改于2022-01-20 07:56:47)
- Python列表(list)反序(降序)的7种实现方式
地址:https://blog.csdn.net/m0_57158496/article/details/128271700
浏览阅读:1.3w
点赞:9 收藏:40 评论:8
(本篇笔记于2022-12-11 23:54:15首次发布,最后修改于2023-03-20 18:13:55)
- pandas 数据类型之 DataFrame
地址:https://blog.csdn.net/m0_57158496/article/details/124525814
浏览阅读:1.0w
点赞:7 收藏:40
(本篇笔记于2022-05-01 13:20:17首次发布,最后修改于2022-05-08 08:46:13)
- 个人信息提取(字符串)
地址:https://blog.csdn.net/m0_57158496/article/details/124244618
浏览阅读:1.0w
点赞:3 收藏:20
(本篇笔记于2022-04-18 11:07:12首次发布,最后修改于2022-04-20 13:17:54)
- 罗马数字转换器|罗马数字生成器
地址:https://blog.csdn.net/m0_57158496/article/details/122592047
浏览阅读:8.2k
收藏:3
(本篇笔记于2022-01-19 23:26:42首次发布,最后修改于2022-01-21 18:37:46)
- 统计字符串字符出现的次数
地址:https://blog.csdn.net/m0_57158496/article/details/130517025
浏览阅读:8.1k
点赞:5 收藏:24
(本篇笔记于2023-05-06 22:28:18首次发布,最后修改于2023-05-12 06:21:40)
- Python字符串居中显示
地址:https://blog.csdn.net/m0_57158496/article/details/122163023
浏览阅读:8.0k
点赞:1 收藏:12 评论:1
- 回车符、换行符和回车换行符
地址:https://blog.csdn.net/m0_57158496/article/details/123109488
浏览阅读:6.7k
点赞:2 收藏:4
(本篇笔记于2022-02-24 13:10:02首次发布,最后修改于2022-02-25 20:07:40)
- python清屏
地址:https://blog.csdn.net/m0_57158496/article/details/120762101
浏览阅读:6.1k
点赞:1 收藏:10
截屏图片
(此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)
精品文章:
- 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
- OPP三大特性:封装中的property
- 通过内置对象理解python'
- 正则表达式
- python中“*”的作用
- Python 完全自学手册
- 海象运算符
- Python中的 `!=`与`is not`不同
- 学习编程的正确方法
来源:老齐教室
◆ Python 入门指南【Python 3.6.3】
好文力荐:
- 全栈领域优质创作者——[寒佬](还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是编程学习的两大利器。
- 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
- 靠谱程序员的好习惯
- 大佬帅地的优质好文“函数功能、结束条件、函数等价式”三大要素让您认清递归
CSDN实用技巧博文:
- 8个好用到爆的Python实用技巧
- python忽略警告
- Python代码编写规范
- Python的docstring规范(说明文档的规范写法)