三种办法的思索都是遍历一个map的Key,然后2个Map分别取那2个Key值所取得的Value。

List的三种遍历格局:
public class TestList {

Python学习种类(五)(文件操作及其字典)

#第一种用entry

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("孙悟空");
    list.add("唐三藏");
    list.add("猪八戒");
    list.add("沙悟净");
    String listString = list.toString();
    System.out.println(listString);

    Integer size = list.size();
    for (int i = 0; i < size; i++) {
        String value1 = list.get(i);
        System.out.println(value1);
    }
    System.out.println("==========================");

    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
        String value2 = iterator.next();
        System.out.println(value2);
    }
    System.out.println("==========================");


    for (String string : list) {
        System.out.println(string);
    }
}}

Hadoop的HDFS和MapReduce子框架首如若本着大数据文件来布署的,在小文件的拍卖上不仅功用低下,而且那些消耗内存资源(每一个小文件占用一个Block,每一个block的元数据都存储在namenode的内存里)。解决办法平常是挑选一个器皿,将那么些小文件协会起来统一存储。HDFS提供了两种类型的器皿,分别是SequenceFile和MapFile。

  Python学习序列(四)(列表及其函数)

private void compareMap(Map<String, String> Map01, Map<String, String Map02>){

        for (Map.Entry<String, String> entry : Map1.entrySet())
        {

           String testKey = entry.getKey();

           if(Map1.get(testId).equals(Map2.get(testId))){

                System.out.println("equals");

            }else{

                System.out.println("not equals");

            }
        }
}

// 第一种方法遍历list集合:for循环
Integer size = list.size();
for (int i = 0; i < size; i++) {
String value1 = list.get(i);
System.out.println(value1);
}
// 第二种格局遍历list集合:iterator 迭代器
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String value2 = iterator.next();
System.out.println(value2);
}
// 第二种办法遍历list集合:foreach
for (String string : list) {
System.out.println(string);
}

一、SequenceFile

SequenceFile的贮存类似于Log文件,所差别的是Log
File的每条记下的是纯文本数据,而SequenceFile的每条记下是可系列化的字符数组。

SequenceFile可经过如下API来已毕新记录的足够操作:

       
fileWriter.append(key,value)

能够看出,每条记下以键值对的方法开展集体,但前提是Key和Value需具备种类化和反序列化的功效

Hadoop预订义了有些Key Class和Value
Class,他们平昔或直接达成了Writable接口,满意了该意义,包括:

Text                                等同于Java中的String
IntWritable                   等同于Java中的Int
BooleanWritable        等同于Java中的Boolean
        .
        .

在存储结构上,SequenceFile紧要由一个Header后跟多条Record组成,如图所示:

澳门金沙国际 1

Header主要包括了Key classname,Value
classname,存储压缩算法,用户自定义元数据等音信,别的,还隐含了一部分联袂标识,用于急忙稳定到记录的界线。

每条Record以键值对的方法展开仓储,用来表示它的字符数组可依次解析成:记录的尺寸、Key的尺寸、Key值和Value值,并且Value值的社团取决于该记录是或不是被压缩。

数据压缩有利于节省磁盘空间和加快网络传输,SeqeunceFile帮助二种格式的数据压缩,分别是:record
compression和block compression。

record compression如上图所示,是对每条记下的value举行削减

block
compression是将一连串的record社团到一道,统一压缩成一个block,如图所示:

澳门金沙国际 2

block音信首要囤积了:块所蕴藏的记录数、每条记下Key长度的集纳、每条记下Key值的集纳、每条记下Value长度的集合和每条记下Value值的聚合

注:每个block的分寸是可经过io.seqfile.compress.blocksize属性来指定的

示例:SequenceFile读/写 操作

[java] view
plaincopy

  1. Configuration conf=new Configuration();  
  2. FileSystem fs=FileSystem.get(conf);  
  3. Path seqFile=new Path(“seqFile.seq”);  
  4. //Reader内部类用于文书的读取操作  
  5. SequenceFile.Reader reader=new SequenceFile.Reader(fs,seqFile,conf);  
  6. //Writer内部类用于文书的写操作,如果Key和Value都为Text类型  
  7. SequenceFile.Writer writer=new SequenceFile.Writer(fs,conf,seqFile,Text.class,Text.class);  
  8. //通过writer向文档中写入记录  
  9. 两种办法,文件操作及其字典。writer.append(new Text(“key”),new Text(“value”));  
  10. IOUtils.closeStream(writer);//关闭write流  
  11. //通过reader从文档中读取记录  
  12. Text key=new Text();  
  13. Text value=new Text();  
  14. while(reader.next(key,value)){  
  15.     System.out.println(key);  
  16.     System.out.println(value);  
  17. }  
  18. IOUtils.closeStream(reader);//关闭read流  

一、文件操作

#第三种用keyset的措施,把key值存到容器,分别取出相比

Map的二种遍历格局:

二、MapFile

MapFile是排序后的SequenceFile,通过观望其目录结构得以见到MapFile由两部分构成,分别是data和index。

index作为文件的数量索引,首要记录了各种Record的key值,以及该Record在文件中的偏移地点。在MapFile被访问的时候,索引文件会被加载到内存,通过索引映射关系可高效定位到指定Record所在文书地方,由此,相对SequenceFile而言,MapFile的检索效用是便捷的,缺点是会花费一部分内存来存储index数据。

需注意的是,MapFile并不会把拥有Record都记录到index中去,默许情形下每隔128条记下存储一个索引映射。当然,记录间隔可人为修改,通过MapFIle.Writer的setIndexInterval()方法,或涂改io.map.index.interval属性;

其它,与SequenceFile分歧的是,MapFile的KeyClass一定要落到实处WritableComparable接口,即Key值是可正如的。

以身作则:MapFile读写操作

[java] view
plaincopy

  1. Configuration conf=new Configuration();  
  2. FileSystem fs=FileSystem.get(conf);  
  3. Path mapFile=new Path(“mapFile.map”);  
  4. //Reader内部类用于文书的读取操作  
  5. MapFile.Reader reader=new MapFile.Reader(fs,mapFile.toString(),conf);  
  6. //Writer内部类用于文书的写操作,假如Key和Value都为Text类型  
  7. MapFile.Writer writer=new MapFile.Writer(conf,fs,mapFile.toString(),Text.class,Text.class);  
  8. 澳门金沙国际 ,//通过writer向文档中写入记录  
  9. writer.append(new Text(“key”),new Text(“value”));  
  10. IOUtils.closeStream(writer);//关闭write流  
  11. //通过reader从文档中读取记录  
  12. Text key=new Text();  
  13. Text value=new Text();  
  14. while(reader.next(key,value)){  
  15.     System.out.println(key);  
  16.     System.out.println(key);  
  17. }  
  18. IOUtils.closeStream(reader);//关闭read流  

注意:使用MapFile或SequenceFile固然可以缓解HDFS中小文件的仓储问题,但也有必然局限性,如:
1.文本不援救复写操作,不能向已存在的SequenceFile(MapFile)追加存储记录
2.当write流不倒闭的时候,没有主意构造read流。也就是在实践文书写操作的时候,该文件是不可读取的

1,读文件

private void compareMap(Map<String, String> Map01, Map<String, String Map02>){  

     Iterator<String> iter = Map1.keySet().iterator();

while (iter.hasNext()) {

            String testKey = iter.next();

       if(Map1.get(testId).equals(Map2.get(testId))){

                System.out.println("equals");

              }else{

                System.out.println("not equals");

            }
public static void main(String[] args) {
    Map<String, Integer> map = new HashMap<>();
    map.put("孙悟空", 1);
    map.put("唐三藏", 2);
    map.put("猪八戒", 3);
    map.put("沙悟净", 4);

    Set<String> keySet = map.keySet();
    for (String key : keySet) {
        Integer value = map.get(key);
        System.out.println("键:"+ key + "值:"+ value);
    }

    Set<Entry<String, Integer>> set = map.entrySet();
    for (Entry<String, Integer> entry : set) {
        String key = entry.getKey();
        Integer value = entry.getValue();
        System.out.println("键:"+ key + "值"+value);
    }
    Iterator<Entry<String, Integer>> entrySet = map.entrySet().iterator();
    while (entrySet.hasNext()) {
        Entry<String, Integer> entry = entrySet.next();
        String key = entry.getKey();
        Integer value = entry.getValue();
        System.out.println("键:" + key + " " + "值:" + value);
    }
}

   
 在以’r’读情势打开文件之后可以调用read函数四遍性将文件内容全方位读出,也足以指定每趟read读多少字节,例如:

##第三种用keyset的办法,遍历Key值

// map遍历操作的第一种办法:keyset + foreach
// 采纳keyset方法通过key值获取value值—》功能低
Set<String> keySet = map.keySet();
for (String key : keySet) {
Integer value = map.get(key);
System.out.println(“键:”+ key + “值:”+ value);
}

澳门金沙国际 3澳门金沙国际 4

public class CompareMap {

    public static void main(String[] args) {

    }

    private void compare(Map<String, String> map1, Map<String, String> map2) {

        for (String testkey : map1.keySet()) {

            if(map1.get(testkey).equals(map2.get(testkey))){

                System.out.println("equals");

            }else{

                System.out.println("not equals");

            }
        }

    }

// map遍历操作的第三种艺术:map.entrySet();+foreach 方法开展遍历
Set<Entry<String, Integer>> set = map.entrySet();
for (Entry<String, Integer> entry : set) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(“键:”+ key + “值”+value);
}

1 #coding:utf-8
2 fn='test1.py'
3 fp=open(fn,'r') #以读的方式打开文件,文件必须首先存在和,.文件在同一目录下py
4 print 'reading pos:',fp.tell()
5 r=fp.read(20) #读取文件内容返回字符串
6 print 'have read:\"'+r+'\''
7 print 'reading pos:',fp.tell()
8 print fp.read()
9 fp.close()

在main方法调用并传递参就可以了,

// map遍历操作的第三种方法:map.entrySet() +迭代器
Iterator<Entry<String, Integer>> entrySet =
map.entrySet().iterator();
while (entrySet.hasNext()) {
Entry<String, Integer> entry = entrySet.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(“键:” + key + ” ” + “值:” + value);
}
}
拥有的章程都是卸载main方法之中的。

View Code

PS:如若要求将结果(相同的value、分裂的value)写入文件,则足以写一个write方法,在每一趟打印写入文件,加文(加文)件地方参数即可

2,写文件

 

   
 假若想将某些内容写入文件,可以以’w’写的措施打开文件(要是文件不设有会创立),并且清空文件从前的始末。

结果写入文件格局write

澳门金沙国际 5澳门金沙国际 6

 

1 fw='test.txt' 
2 fp=open(fw,'w') 
3 fp.write('www.google.com') 
4 fp.close() 
   public static void write(String file, String valueOfMap1, String valueOfMap2) {

        try {
            BufferedWriter input = new BufferedWriter(new OutputStreamWriter(
                    new FileOutputStream(file, true)));
            input.write("Map1Output: " + valueOfMap1 + "\r\n");
            input.write("Map2Output: " + valueOfmap2 + "\r\n");
            input.newLine();
            input.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

View Code

 

3,读写文件r+,w+

   
 二者分裂在于:r+是必须针对已存在的文书;w+可以创设未存在的文本。

澳门金沙国际 7澳门金沙国际 8

1  fn='rplus.txt'
2  fp=open(fn,'w+') 
3  r=fp.read(12) 
4  print r 
5  fp.close()

View Code

4,追加写入文件a

 
 ‘w’写情势打开的公文只可以把内容写入文件,原有内容将被拔除,若想保留,则用‘a’追加写格局。

澳门金沙国际 9澳门金沙国际 10

 1 fn='rplus.txt'
 2 fp=open(fn,'w+')
 3 fp.write('aaaaa\n')
 4 fp.close()
 5  
 6 fa=open('rplus.txt','a')
 7 fa.write('bbbbb\n')
 8 fa.close()
 9  
10 fa=open(fn,'r')
11 r=fa.read()
12 print r
13 fa.close()

View Code

二,格式化读写文件

1,格式化写文件

   
 调用write函数,使用格式化控制符来格式化写入字符串。

澳门金沙国际 11澳门金沙国际 12

1 fn='wformat.txt'
2 fw=open(fn,'w')
3 fw.write('%10s\t %3s\t %6s\n'%('name','age','sex'))
4 fw.write('%10s\t %3s\t %6s\n'%('张三',78,'male'))
5 fw.write('%10s\t %3s\t %6s\n'%('李四',50,'male'))
6 fw.write('%10s\t %3s\t %6s\n'%('王五',80,'male'))
7 fw.write('%10s\t %3s\t %6s\n'%('张强',90,'female'))
8 fw.close()

View Code

2,读成列表

   
 文件的readlines函数可以将文件文件的好多行文本一一映射成列表的几何项,即文本文件的每一行映射成列表的一个多少项,每个数据项都是字符串。

澳门金沙国际 13澳门金沙国际 14

1 fr=open('templist.txt','r')
2 print fr.readlines()
3 fr.close()

View Code 

结果如下:

澳门金沙国际 15澳门金沙国际 16

1 >>>
2 [' aaaaaaaa\n', ' bbbbbbbb\n', ' cccccccc']

View Code

3,读成一行文件

   
 调用readline函数读一行内容,而read函数是四次性将文件的情节全方位读回。其它,可以用strip函数去掉\n和空格。

澳门金沙国际 17澳门金沙国际 18

1 fr=open('templist.txt','r')
2 print fr.readline().strip().strip('\n')
3 print fr.readline().strip().strip('\n')
4 print fr.readline().strip().strip('\n')
5 fr.close() 

View Code

结果如下:

澳门金沙国际 19澳门金沙国际 20

1 >>>
2 aaaaaaaa
3 bbbbbbbb
4 cccccccc

View Code

4,split格式化数据

澳门金沙国际 21澳门金沙国际 22

1 fr=open('wformat.txt','r')
2 line1=fr.readline()
3 print line1
4 line2=fr.readline()
5 print line2
6 print line2.split('\t')
7 fr.close()

View Code

结果如下:

澳门金沙国际 23澳门金沙国际 24

1 >>>
2       name     age     sex
3  
4       张三     78     male
5  
6 [' \xd5\xc5\xc8\xfd', ' 78', ' male\n']

View Code

读取文件(格式化)的内容:

澳门金沙国际 25澳门金沙国际 26

 1 fr=open('wformat.txt','r')
 2 while (1==1):
 3     line=fr.readline()
 4     if(line==''):
 5         break
 6     else:
 7         print line
 8 fr.close()
 9  
10 >>> ================================ RESTART ================================
11 >>>
12       name     age     sex
13  
14       张三     78     male
15  
16       李四     50     male
17  
18       王五     80     male
19  
20       张强     90     female
21  
22 >>> 

View Code

5,读写子目录文件

   
 只需点名文件时描述好途径即可,可是注意两点:1)转义字符的题材;2)不可能创制文件夹,文件夹必须事先存在。

澳门金沙国际 27澳门金沙国际 28

1 fn='c:\\test.txt' 
2 fp=open(fn,'w+') 
3 fp.write('www.python.com') 
4 fp.close() 

View Code

 

三,字典及其基本操作

1,字典定义

     字典:由一对称之为键和值构成,用逗号间隔起来,用花括号括起来就结成了字典。语法结构:

               
dict_name={key:value,key:value,key:value,……}

   
 字典的数额项的值可以是字典,列表等数据类型。

2,基础操作

1)字典长度:

   
len函数可以测得字典的数额项个数。

澳门金沙国际 29澳门金沙国际 30

1 >>> dict1={'a':'b','name':'jeap',12:34}
2 >>> len(dict1)
3 3

View Code

2)元素值的拜会:

   
 Python的字典可以通过键获取其所对应的值,而连串型数据字符串,列表则是透过index索引来获取的。字典的因素的涉嫌相比疏松,是无序的。

澳门金沙国际 31澳门金沙国际 32

1 >>> dict1={'a':'b','name':'jeap',12:34}
2 >>> print dict1['a'],dict1[12]
3 b 34

View Code

3)元素值的修改:

    通过键获取修改所对应的值。

澳门金沙国际 33澳门金沙国际 34

1  >>> dict1['a']='hello'
2 >>> print dict1
3 {'a': 'hello', 12: 34, 'name': 'jeap'}

View Code

4)元素项的删除:

     通过del 字典名[键]来删除字典里的元素。

澳门金沙国际 35澳门金沙国际 36

1 >>> del dict1[12]
2 >>> print dict1
3 {'a': 'hello', 'name': 'jeap'}

View Code

5)元素项的充实:

      通过字典名[新键]赋值的艺术在字典里新增一个数据项。

澳门金沙国际 37澳门金沙国际 38

1 >>> dict1['QQ']='649414754'
2 >>> print dict1
3 {'a': 'hello', 'QQ': '649414754', 'name': 'jeap'}
4 >>> dict1['sex']='F'
5 >>> print dict1
6 {'a': 'hello', 'QQ': '649414754', 'name': 'jeap', 'sex': 'F'}

View Code

6)in运算:

     判断某键是或不是留存于字典里。

澳门金沙国际 39澳门金沙国际 40

1 >>> 'name' in dict1
2 True
3 >>> 'F' in dict1
4 False

View Code

小心:in运算查找的是Key值,而非value值。

 

四,字典的相干函数

1)clear函数:清空字典数据项。

澳门金沙国际 41澳门金沙国际 42

1 >>> print dict1
2 {'a': 'hello', 'QQ': '649414754', 'name': 'jeap', 'sex': 'F'}
3 >>> dict1.clear()
4 >>> print dict1
5 {}

View Code

2)copy函数:字典复制,与源对象间的涉及是备份关系。

澳门金沙国际 43澳门金沙国际 44

1 >>> dict1={'a': 'hello', 'QQ': '649414754', 'name': 'jeap', 'sex': 'F'}
2 >>> dict2=dict1.copy()
3 >>> print dict2
4 {'a': 'hello', 'QQ': '649414754', 'name': 'jeap', 'sex': 'F'}

View Code

3)get函数:获取某键锁对应的值,等价于dict_name[键]。

澳门金沙国际 45澳门金沙国际 46

1 {'a': 'hello', 'QQ': '649414754', 'name': 'jeap', 'sex': 'F'}
2 >>> dict1.get('QQ')
3 '649414754'

View Code

4)keys函数:获取字典所有的key。

澳门金沙国际 47澳门金沙国际 48

1 >>> dict1.keys()
2 ['a', 'QQ', 'name', 'sex']

View Code

5)values函数:获取字典所有的value。

澳门金沙国际 49澳门金沙国际 50

1 >>> dict1.values()
2 ['hello', '649414754', 'jeap', 'F']

View Code

6)intems函数:获取字典所有的key-value。

澳门金沙国际 51澳门金沙国际 52

1 >>> dict1.items()
2 [('a', 'hello'), ('QQ', '649414754'), ('name', 'jeap'), ('sex', 'F')]

View Code

7)update函数:更新字典里某键(key)的键值(value),如果更新的key原字典没有,则update就向字典里添加一项数据。

澳门金沙国际 53澳门金沙国际 54

1 >>> new={'age':32}  #原字典没有,新增
2 >>> add={'name':'张三'} #原字典存在,更新'jeap'为'张三'
3 >>> dict1.update(new)
4 >>> dict1.update(add)
5 >>> print dict1
6 {'a': 'hello', 'QQ': '649414754', 'name': '\xd5\xc5\xc8\xfd', 'age': 32, 'sex': 'F'}

View Code

8)dict函数:创立字典。

   上边举例二种成立字典的格局:

澳门金沙国际 55澳门金沙国际 56

 1 >>> d0=dict() #创建空字典
 2 >>> print d0
 3 {}
 4 >>> d1=dict(name='zhangsan',QQ='123456789',age=23)#通过赋值创建字典
 5 >>> print d1
 6 {'QQ': '123456789', 'age': 23, 'name': 'zhangsan'}
 7 >>> val=['lisi','649414754',25]
 8 >>> print val
 9 ['lisi', '649414754', 25]
10 >>> key=range(1,4)
11 >>> d2=dict(zip(key,val))#使用一对列表创建字典
12 >>> print d2
13 {1: 'lisi', 2: '649414754', 3: 25}

View Code

9)pop和popitem函数:pop方法通过键key获取其值value并从字典中去除该数额项;popitem函数则是轻易移除一个数码项,重返值是元组。

澳门金沙国际 57澳门金沙国际 58

 1 >>> val=['Tom','Jack','Rose','John','Mark']
 2 >>> key=range(1,6)
 3 >>> dic=dict(zip(key,val))
 4 >>> print dic
 5 {1: 'Tom', 2: 'Jack', 3: 'Rose', 4: 'John', 5: 'Mark'}
 6 >>> dic.pop(2)
 7 'Jack'
 8 >>> dic.popitem()
 9 (1, 'Tom')
10 >>> print dic
11 {3: 'Rose', 4: 'John', 5: 'Mark'}

View Code

10)实践应用:字典和for循环遍历字典。

   
 i)通过in运算和键,来访问字典的值。

澳门金沙国际 59澳门金沙国际 60

 1 >>> key=range(1,6)
 2 >>> val=['Tom','Jack','Rose','John','Mark']
 3 >>> dic=dict(zip(key,val))
 4 >>> for x in dic:
 5  print dic[x]
 6  
 7  
 8 Tom
 9 Jack
10 Rose
11 John
12 Mark

View Code

   
 ii)通过items函数重临值为(key,value)元组组成的列表来走访。

澳门金沙国际 61澳门金沙国际 62

 1 >>> print dic.items()
 2 [(1, 'Tom'), (2, 'Jack'), (3, 'Rose'), (4, 'John'), (5, 'Mark')]
 3 >>> for (k,v) in dic.items():
 4  print 'dic[',k,']=',v
 5  
 6  
 7 dic[ 1 ]= Tom
 8 dic[ 2 ]= Jack
 9 dic[ 3 ]= Rose
10 dic[ 4 ]= John
11 dic[ 5 ]= Mark
12 >>> 

View Code

 五,小结

      本章紧要介绍python开发的进阶知识,文件的基本操作,字典的连带概念,基本操作运算和连锁函数,为事后实战运用做一个搭配,本章存在的遗留问题是,如何调用不在同一目录文件下的.py自定义模块?根据书上的代码未能兑现。

相关文章