CSV 文件的读写
CSV 文件是一种文本文件,其中的数据使用逗号分隔。通常我们会使用 Excel 来打开 CSV 文件,其数据表现和正常的 Excel 表格无异。
CSV 和 Excel 的区别关键在于 文本文件 和 二进制文件 的区别。
文本文件就是直接使用 ASCII 码进行存储的文件,以行为单位;
普通的记事本就可以完成翻译工作;二进制文件则是把数据转化为二进制进行存储,需要通过特定的应用才能“翻译”显示出来,例如音频、视频等等。
之所以 Excel 能够实现格式化的读取 CSV 主要得益于逗号的分隔实现了数据之间列与列的区分。
使用 Excel 打开
使用记事本打开
使用 CSV 的好处很明显:
- 文本文件使用程序读写方便
- CSV 和 Excel 的兼容让人对文件的读写更加方便。
- CSV 文件在很多场景下都有应用,适用范围广
利用 CSV 的这些特点,可以使用 CSV 作为不同程序之间传递数据的中间媒介。
在前段时间的 Operating Systems: Lab 1 SPF(Shortest-Process-First) 中就使用了 CSV 实现了从 Java 主程序向 Python 的绘图程序传送数据。
如何读写
前文提到了 CSV 是一种文本文件,他并未有严格的规范和标准,并且是使用 ASCII 码进行存储的。在此之前如果学习过 TXT 文件的读写,那么下一步就很明了了 —— CSV 文件的读写和 TXT 文件的读写无二。
唯一需要注意的一点是 CSV 使用逗号分隔数据,因此我们在读取的时候依旧可以按照 TXT 文件的方式进行,但是在写入时需要注意将同一行的数据使用 ","
拼接起来,然后再写入文件。
使用 Java 读写 CSV 文件
这里简单的介绍一下 Java
的文件读写.( C/C++ 的读写方式和 Java 十分类似, 这里不再演示了 )
Java
的读写首先需要获取一个文件对象, 这个文件对象抽象的表示的一个文件或者文件路径.
在创建 File
对象后可以使用 listFiles()
方法获取当前路径下的所有文件(返回值是一个 File
数组), 作用类似控制台中的 dir
命令,可以同时读取当前目录下的文件夹和文件。
File file = new File(path);
创建好 File
对象之后, 就可以使用其作为参数创建 Scanner
对象和 PrintWriter
对象.
Scanner in = new Scanner(file);
PrintWriter out = new PrintWriter(file);
在 Java
中关于输入输出的类还有很多, 包括以何种模式对文件进行读取和写入都可以根据自己的需要更改, 这里就不在详述了.
文件内信息
运行结果
import java.io.*;
import java.util.*;
public class Main{
/*
* saveData() 方法向 CSV 中写入数据
* 与向 TXT 文件写入数据几乎没有区别,
* 只需要在拼接数据时注意添加 “,”
*/
static void saveData() throws Exception
{
/*
* 基本的文件输入输出格式
*/
File file = new File("./test.csv");
PrintWriter writer = new PrintWriter(file);
for(int i=0;i<3;i++)
{
String data = "";
/*
* 拼接数据,这里是随意拼接的测试数据
*/
for(int j=0;j<3;j++)
{
data+="data"+(i*3+j);
if(j != 2) data+=',';
}
writer.println(data);
}
/*
* 关闭文件输入或者是刷新缓冲区
*/
// writer.flush();
writer.close();
}
/*
* getData() 方法从 CSV 中读取数据
* 使用 ArrayList 存储
*/
static void getData() throws Exception
{
/*
* 基本的文件输入格式
*/
File file = new File("./test.csv");
Scanner in = new Scanner(file);
/*
* 嵌套的 Arraylist 存储数据,
* 通过二维的嵌套实现逻辑上二维表格的存储
* 这里也可以使用二维数组存储
*/
ArrayList<String []> data = new ArrayList<String []>();
while(in.hasNextLine())
{
/*
* 循环读入所有数据
* 将数据使用 split(",") 方法分割
* 并将分割后的数据存入数组
*/
String newLine = in.nextLine();
String eachData[] = newLine.split(",");
data.add(eachData);
}
in.close();
/*
* 使用 ArrayList 访问读取到的数据,
* 这里分别展示了:
* foreach 方式的遍历
* get() 方法实现的读取
*/
for (String[] rowData : data)
{
for(String _data : rowData)
{
System.out.print(_data+" ");
}
System.out.println();
}
System.out.println(data.get(1)[1]);
}
public static void main(String[] args) throws Exception
{
saveData();
getData();
}
}
使用 Python 读取 CSV
Python
的优势在于丰富的第三方库, 因此我们可以选择第三方库进行更便捷的操作.
在这里使用的两个库为: pandas
和 numpy
.
pandas
是一个扩展程序库,用于数据分析, 可以便捷的从 CSV、JSON、SQL、Microsoft Excel 中导入数据。
numpy
是一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
对于 CSV 文件, 可以直接调用 pandas
库的 read_csv()
方法.
默认情况下读取第一行数据作为表头, 之后可以通过表头使用下标访问数据.
然后使用 numpy
将数据转化为数组即可.
运行结果
import pandas as pd
import numpy as np
import os
# 读取 CSV 文件
_data = pd.read_csv("./test.csv")
print(_data)
# 读取列标为 "column1" 的数据
column1 = _data["column1"];
print(column1)
# 将数据转化为数组存储
array1 = np.array(column1)
print(array1)