C#中的文件流学习笔记第3篇

源于 Python科学总计
http://hyry.dip.jp/tech/book/page/scipy/numpy_file.html

   前言:那篇博客作者根本说一下C#华语件流的利用规则,也是从最基础方面去说,也相信我们大家只要是干Web行业的这么些知识点肯定能用上,当中介绍多少个操作文件流的类,帕特h类,FileStream类,Read和Write方法的行使

NumPy提供了二种存取数组内容的公文操作函数。保存数组数据的文件能够是二进制格式或许文本格式。二进制格式的文书又分为NumPy专用的格式化二进制类型和无格式类型。

  1. Path

1.tofile和fromfile()存取二进制格式文件

(1) 文件路径有哪些特点?

运用数组对象的tofile()方法能够便宜地将数组中的数据以二进制格式写进文件。tofile()输出的多少不保存数组形状和要素类型等音讯。因而用fromfile()函数读回数据时索要用户钦赐成分类型,并对数组的模样实行适度的修改:

            1)[根目录:\]文件夹\文件名.后缀名

>>> a = np.arange(0,12)
>>> a.shape = 3,4
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> a.tofile("a.bin")
>>> b = np.fromfile("a.bin", dtype=np.float) # 按照float类型读入数据
>>> b # 读入的数据是错误的
array([  2.12199579e-314,   6.36598737e-314,   1.06099790e-313,
         1.48539705e-313,   1.90979621e-313,   2.33419537e-313])
>>> a.dtype # 查看a的dtype
dtype('int32')
>>> b = np.fromfile("a.bin", dtype=np.int32) # 按照int32类型读入数据
>>> b # 数据是一维的
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
>>> b.shape = 3, 4 # 按照a的shape修改b的shape
>>> b # 这次终于正确了
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

(2)合并路径   Combine

从地点的事例能够看出,在读入数据时必要正确安装dtype参数,并修改数组的shape属性才能获取和原始数据一致的结果。无论数额的排列顺序是C语言格式照旧Fortran语言格式,tofile()都合并使用C语言格式输出。别的借使钦定了sep参数,则fromfile()和tofile()将以文本格式对数组进行输入输出。sep参数内定的是文本数据中数值的分隔符。

      string p4 = Path.Combine(@”c:\123a\abc\”,
“白天不懂夜的黑.mp4”);

 

       string p5 = Path.Combine(@”c:\123a\abc”, “白天不懂夜的黑.mp4”);

2.load()和save()存取NumPy专用的二进制格式文件

(3)获得文件夹的途径  GetDirectoryName

load()和save()用NumPy专用的二进制格式保存数据,它们会活动处理成分类型和造型等音讯:

            string p2 = Path.GetDirectoryName(path);

>>> np.save("a.npy", a)
>>> c = np.load( "a.npy" )
>>> c
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

(4)得到全路径 GetFullPath

设若想将八个数组保存到3个文书中,可以动用savez()。savez()的第一个参数是文本名,其后的参数都是急需保留的数组,也得以使用首要字参数为数组起名,非关键字参数字传送递的数组会自动起名为arr_0、arr_壹 、…。savez()输出的是两个扩充名为npz的压缩文件,当中每一种文件都以三个save()保存的npy文件,文件名和数组名相同。load()自动识别npz文件,并且重回一个近乎于字典的对象,能够因此数组名作为键获取数组的剧情:

            string full = Path.GetFullPath(“1.txt”);

>>> a = np.array([[1,2,3],[4,5,6]])
>>> b = np.arange(0, 1.0, 0.1)
>>> c = np.sin(b)
>>> np.savez("result.npz", a, b, sin_array = c)
>>> r = np.load("result.npz")
>>> r["arr_0"] # 数组a
array([[1, 2, 3],
       [4, 5, 6]])
>>> r["arr_1"] # 数组b
array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9])
>>> r["sin_array"] # 数组c
array([ 0.        ,  0.09983342,  0.19866933,  0.29552021,  0.38941834,
        0.47942554,  0.56464247,  0.64421769,  0.71735609,  0.78332691])

(5)得到后缀名 GetExtension

用解压软件打开“result.npz”文件,会意识内部有四个公文:“arr_0.npy”、“arr_1.npy”和“sin_array.npy”,在那之中分别保存着数组a、b、c的内容。

            string p3 = Path.GetExtension(path);

save()和savez()输出的二进制文件有更加的格式,较难用别的语言编写的程序读入。

(6)获得文件名 GetFileName

 

            string p6 = Path.GetFileName(path);

3.savetxt()和loadtxt()存取文本文件

(7)更改文件后缀名 ChangeExtension

savetxt()和loadtxt()能够读写保存1维和2维数组的公文文件。例如能够用它们读写CSV格式的文件文件:

            string path = @”c:\HYL\CS\File\Exise.avi”;

>>> a = np.arange(0,12,0.5).reshape(4,-1)
>>> np.savetxt("a.txt", a) # 缺省按照'%.18e'格式保存数值,以空格分隔
>>> np.loadtxt("a.txt")
array([[  0. ,   0.5,   1. ,   1.5,   2. ,   2.5],
       [  3. ,   3.5,   4. ,   4.5,   5. ,   5.5],
       [  6. ,   6.5,   7. ,   7.5,   8. ,   8.5],
       [  9. ,   9.5,  10. ,  10.5,  11. ,  11.5]])
>>> np.savetxt("a.txt", a, fmt="%d", delimiter=",") #改为保存为整数,以逗号分隔
>>> np.loadtxt("a.txt",delimiter=",") # 读入的时候也需要指定逗号分隔
array([[  0.,   0.,   1.,   1.,   2.,   2.],
       [  3.,   3.,   4.,   4.,   5.,   5.],
       [  6.,   6.,   7.,   7.,   8.,   8.],
       [  9.,   9.,  10.,  10.,  11.,  11.]])

            string p1= Path.ChangeExtension(path, “rmvb”);

一些CSV文件中除去保留数值之外,还保存一些申明文字,例如第2行和第二列普通为列名和行名。借使急需忽略CSV文件的率先行和率先列,能够先将文件读为字符串数组,然后取出供给的有的再更换为数值数组。例如对于上面的CSV数据文件:

(8)再次来到暂时文件夹   GetTempPath

姓名,年龄,体重,身高
张三,30,75,165
李四,45,60,170
王五,15,30,120

            string s= Path.GetTempPath();

能够行使如下的次序读入个中的数值部分:

  1. FileStream(文件流),专门将文件以字节流的样式开展拍卖

 

(1)父类Stream(流)

"""
使用NumPy快速读取CSV文件。
"""
import numpy as np

# 采用字符串数组读取文件
tmp = np.loadtxt("test.csv", dtype=np.str, delimiter=",")

# 将部分数组的值进行转换
data = tmp[1:,1:].astype(np.float)
print data

# 定义结构数组元素的类型
persontype = np.dtype({
    'names':['name', 'age', 'weight', 'height'],
    'formats':['S32','i', 'f', 'f']})

f = file("test.csv")
f.readline() # 跳过第一行
data = np.loadtxt(f, dtype=persontype, delimiter=",")
f.close()
print data

     (2)使用文件流,无非就是读取和写入文件

读取CSV文件

            ->读取文件,就不可能不想方法打开文件,使用构造方法

>>> tmp = np.loadtxt("test.csv", dtype=np.str, delimiter=",")
>>> data = tmp[1:,1:].astype(np.float)
>>> data
array([[  30.,   75.,  165.],
       [  45.,   60.,  170.],
       [  15.,   30.,  120.]])
static void Main(string[] args)

{

                          using (FileStream fileRead = new FileStream(@"F:\heima\practice\总复习\文件流的读取\bin\Debug\SqlHelper.txt", FileMode.Open, FileAccess.Read))

         {

                    int num;

                    while ((num = fileRead.ReadByte()) != -1)

                    {

                            Console.Write((char)num);

                     }

                    Console.ReadKey();

        }

 }

其余,使用结构数组也能读入那样的公文,并且能够选取差异的因素类型保存每一个列的值,上边先定义结构数组的花色:

     (3)使用Writer成立文件同时写入音信: 

>>> persontype = np.dtype({
...     'names':['name', 'age', 'weight', 'height'],
...     'formats':['S32','i', 'f', 'f']})
static void Main(string[] args)

{

            using (FileStream fileWriter = new FileStream("file.txt", FileMode.Create, FileAccess.Write))

            {

                Console.WriteLine("请输入信息");

                string str = Console.ReadLine();

                byte[] bs = Encoding.Default.GetBytes(str);

                for (int i = 0; i < bs.Length; i++)

                {

                    fileWriter.WriteByte(bs[i]);

                }

            }
}   

鉴于文件中的第三行不是多少,因而需求先开辟数据文件,读取完第二行以往,再把公文对象传递给loadtxt():>>> f = file(“test.csv”)>>>
f.readline(>>> data = np.loadtxt(f, delimiter=”,”,
dtype=persontype)

     (4)自身手动书写一个ACSII码表,不须要百度了,只要大家程序员有计算机

>>> print data
[('\xe5\xbc\xa0\xe4\xb8\x89', 30, 75.0, 165.0)
 ('\xe6\x9d\x8e\xe5\x9b\x9b', 45, 60.0, 170.0)
 ('\xe7\x8e\x8b\xe4\xba\x94', 15, 30.0, 120.0)]
static void Main(string[] args)

{

            List<string> list = new List<string>();

            list.Add("<body>");

            for (int i = 0; i < 128; i++)

            {

                list.Add(string.Format("子符  <font size=\"7\" color=\"red\">{0}</font>  的ASCII码为  <font size=\"7\" color=\"red\">{1}</font>  <br/>", (char)i, i));

            }

            list.Add("</body>");

            File.WriteAllLines("ASCII.html", list.ToArray(), Encoding.Default);

}

4.用到文件对象

      图片 1

事实上,后边介绍的拥有读写文件的函数都得以平昔利用已经打开的文本对象,固然利用文件对象,可以将七个数组储存到三个npy文件中:

  1. FileStream
>>> a = np.arange(8)
>>> b = np.add.accumulate(a)
>>> c = a + b
>>> f = file("result.npy", "wb")
>>> np.save(f, a) # 顺序将a,b,c保存进文件对象f
>>> np.save(f, b)
>>> np.save(f, c)
>>> f.close()
>>> f = file("result.npy", "rb")
>>> np.load(f) # 顺序从文件对象f中读取内容
array([0, 1, 2, 3, 4, 5, 6, 7])
>>> np.load(f)
array([ 0,  1,  3,  6, 10, 15, 21, 28])
>>> np.load(f)
array([ 0,  2,  5,  9, 14, 20, 27, 35])

    (1) ReadByte() 读取2个字节,重回对应的间接表示数字的十进制格局

 

    (2)WriteByte() 能够写3个字节

    (3)复制文件,对文本加密,解密

 static void Main(string[] args)

        {

            //对文件进行一个简单加密

            using (FileStream fileRead = new FileStream("梦想的力量.mp3", FileMode.Open, FileAccess.Read))

            {

                using (FileStream fileWrite = new FileStream("梦想.mp3", FileMode.Create, FileAccess.Write))

               {

                    int num = -1;

                    while ((num = fileRead.ReadByte()) != -1)

                    {

                        num++;

                        fileWrite.WriteByte((byte)num);

                   }

                    Console.WriteLine("OK");

                }

            }

            //对上面加密的文件进行解密

            using (FileStream fileRead = new FileStream("梦想.mp3", FileMode.Open, FileAccess.Read))

      {

                using (FileStream fileWrite = new FileStream("梦想_解密.mp3", FileMode.Create, FileAccess.Write))

                {

                    int num = -1;

                    while ((num = fileRead.ReadByte()) != -1)

                    {

                        num--;

                        fileWrite.WriteByte((byte)num);

                    }

                    Console.WriteLine("OK");

                }

            }

 }
  1. Read和Write的使用

(1) Read(存放数据的byte数组,从数组的率先号地点上马放多少,取出多少数量)

(2)一般景观接纳的时候 Read(数组名,0,数组名.Length);

static void Main(string[] args)

{

            //读取文件流

            byte[] bs=new byte[10];

            using (FileStream fileRead = new FileStream("file.txt", FileMode.Open, FileAccess.Read))

            {

                //Read(存放数据的byte数组,从数组的第一号位置开始放数据,取出多少数据)

                //一般情况使用的时候 Read(数组名,0,数组名.Length);

                int count = 0;

                while ((count = fileRead.Read(bs, 0, bs.Length))>0)

                {

                    for (int i = 0; i < count; i++)

                    {

                        Console.WriteLine((char)bs[i]);

                    }

                }

            }

            //写流

            using(FileStream fileWrite=new FileStream("file.txt",FileMode.Create,FileAccess.Write))

            {

                byte[] bs = { 0, 97, 98, 99, 48, 49 };

                fileWrite.Write(bs, 1, bs.Length - 1);

            }

}

(3)使用Write和Read复制文件

            1)语法完毕

                   using(fileRead)

                   {

                          using(fileWrite)

                          {

                                 byte[] bs=new byte[10*1024*1024];

                                 int count=0;

                                
while((count=fileRead.Read(bs,0,bs.Length))>0)

                                 {

                                        fileWrite.Write(bs,0,count);

                                 }

                          }

                   }

  1. 动用命令行参数控制造进程序,达成控制台程序的劳而无功反类犬copy

(1) 首先新建3个控制台应用程序,起名随便,然后写入如下代码:

 static void Main(string[] args)

{

            //保证给的参数只有两个

            if (args.Length != 2)

            {

                Console.WriteLine("命令语法不正确");

                return;

            }

            //得到文件的路径

            string file1 = args[0];

            string file2 = args[1];

            //判断第一个文件是否存在

            try

            {

                using (FileStream fileRead = new FileStream(file1, FileMode.Open, FileAccess.Read))

                {

                    using (FileStream fileWrite = new FileStream(file2, FileMode.Create, FileAccess.Write))

                    {

                        byte[] bs = new byte[10 * 1024];

                        int count = 0;

                        while ((count = fileRead.Read(bs, 0, bs.Length)) > 0)

                        {

                            fileWrite.Write(bs, 0, count);

                        }

                        Console.WriteLine("以复制\t\t1个文件");

                    }

                }

            }

            catch

            {

                Console.WriteLine("系统找不到指定文件");

            }

}

(2)然后运转程序,找到Debug文件夹上边包车型客车exe文件,复制1个备份,起名为hylcopy.exe

(3)将那些文件复制到C:\Windows这一个目录上面,然后运维cmd命令

(4)输入的新闻如图所示:

    图片 2

下卷博客再说一下局地任何的流文件,读写流StreamReader和StreamWriter方法,还有File类和Directory类。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图