---
source_url: https://docs.dolphindb.cn/zh/progr/file_io/process_txt.html
fetched_at: 2026-05-19T09:02:59Z
category: progr
title: 文本文件处理
sha1: 346393845ad25456b469d366520336ff155601b6
---

# 文本文件处理

对于基本的文本文件读写操作，我们提供了五个函数：

- *readLine*
- *readLines*
- *readLines!*
- *writeLine*
- *writeLines*

当系统读取文本文件时，回车字符、换行字符或者回车换行字符的组合会被当作行的分隔符。当系统往一个文件中写入一行时，行分隔符会被附加到这行的后面。行分隔符在不同的操作系统上也是不同的。在WINDOWS中，行分隔符为回车符和换行字符的组合。在其他系统中，行分隔符为换行字符。

## 读写单行

[writeLine](../../funcs/w/writeLine.html)
函数把一行写入到指定文件中。该函数将会自动附加一个行分隔符到写入行的后面。因此该字符串不需要以行分隔符结尾。如果操作成功，函数返回1；否则抛出IOExeception。[readLine](../../funcs/r/readLine.html)
函数从给定文件中读取一行。读取的行不包含行分隔符。如果到达文件尾，函数返回一个NULL对象，该对象可以用isVoid函数来判断是否已读完文件。如果由于其他原因该操作失败了，将抛出IOException。

```dolphindb
x=`IBM`MSFT`GOOG`YHOO`ORCL
eachRight(writeLine, file("test.txt","w"), x)
fin = file("test.txt")
do{
   x=fin.readLine()
   if(x.isVoid()) break
   print x
}while(true);

IBM
MSFT
GOOG
YHOO
ORCL
```

## 读写多行

[writeLines](../../funcs/w/writeLines.html)
函数往指定文件中写入多行。该函数自动添加换行符到每一行数据后面。如果操作成功，函数返回写入的行数；否则抛出IOException。[readLines](../../funcs/r/readLines.html)
函数从文件中读取指定数量的行。默认行数为1024。当到达文件尾或者指定行数全部读完，该函数返回。如果实际读取的行数小于要求读取的行数，那么表明已到达文件尾。如果由于其他原因该操作失败了，抛出IOException。

```dolphindb
timer(10){
   x=rand(`IBM`MSFT`GOOG`YHOO`ORCL,10240)
   eachRight(writeLine, file("test.txt","w"),x)
   fin = file("test.txt")
   do{ y=fin.readLine() }while(!y.isNull())
   fin.close()
};

Time elapsed: 271.035 ms

timer(10){
   x=rand(`IBM`MSFT`GOOG`YHOO`ORCL,10240)
   file("test.txt","w").writeLines(x)
   fin = file("test.txt")
   do{ y=fin.readLines(1024)}while(y.size()==1024)
   fin.close()
};

Time elapsed: 33.503 ms
```

上例比较了单行处理和多行处理的性能。可以看到，多行处理比单行处理快了约9倍。readLines
函数为每次调用都创建了一个字符串向量。创建向量需要花费时间，所以如果可以把相同向量当作缓冲区使用，就能减少时间开销。`readLines!`函数正是使用这样的方式来提高速度。

下面两个例子每次读取相同数量的数据，执行100次，结果显示：`readLines!`要比`readLines`函数快。

```dolphindb
timer(100){
   fin = file("test.txt")
   do{ y=fin.readLines(1024) } while(y.size()==1024)
   fin.close()
};

Time elapsed: 79.511 ms

timer(100){
   fin = file("test.txt")
   y=array(STRING,1024)
   do{ lines = fin.readLines!(y,0,1024) } while(lines==1024)
   fin.close()
};

Time elapsed: 56.034 ms
```
