CSV 文件的读写

CSV 文件的读写

CSV 文件是一种文本文件,其中的数据使用逗号分隔。通常我们会使用 Excel 来打开 CSV 文件,其数据表现和正常的 Excel 表格无异。

CSV 和 Excel 的区别关键在于 文本文件二进制文件 的区别。
文本文件就是直接使用 ASCII 码进行存储的文件,以行为单位;
普通的记事本就可以完成翻译工作;二进制文件则是把数据转化为二进制进行存储,需要通过特定的应用才能“翻译”显示出来,例如音频、视频等等。

之所以 Excel 能够实现格式化的读取 CSV 主要得益于逗号的分隔实现了数据之间列与列的区分。

UseExcel

使用 Excel 打开
UseText

使用记事本打开

使用 CSV 的好处很明显:

  1. 文本文件使用程序读写方便
  2. CSV 和 Excel 的兼容让人对文件的读写更加方便。
  3. 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 中关于输入输出的类还有很多, 包括以何种模式对文件进行读取和写入都可以根据自己的需要更改, 这里就不在详述了.

CSVContent

文件内信息

JavaResult

运行结果

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 的优势在于丰富的第三方库, 因此我们可以选择第三方库进行更便捷的操作.

在这里使用的两个库为: pandasnumpy .

pandas 是一个扩展程序库,用于数据分析, 可以便捷的从 CSV、JSON、SQL、Microsoft Excel 中导入数据。
numpy 是一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

对于 CSV 文件, 可以直接调用 pandas 库的 read_csv() 方法.
默认情况下读取第一行数据作为表头, 之后可以通过表头使用下标访问数据.
然后使用 numpy 将数据转化为数组即可.

PythonResult

运行结果

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)
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇