Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

from future import standard_library 

standard_library.install_aliases() 

from builtins import str 

from builtins import object 

# Copied from http://docs.python.org/library/csv.html 

 

import csv 

import codecs 

import io 

 

 

class UTF8Recoder(object): 

 

    """ 

    Iterator that reads an encoded stream and reencodes the input to UTF-8 

    """ 

 

    def __init__(self, f, encoding): 

        self.reader = codecs.getreader(encoding)(f) 

 

    def __iter__(self): 

        return self 

 

    def __next__(self): 

        return self.reader.next().encode("utf-8") 

 

 

class UnicodeReader(object): 

 

    """ 

    A CSV reader which will iterate over lines in the CSV file "f", 

    which is encoded in the given encoding. 

    """ 

 

    def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): 

        f = UTF8Recoder(f, encoding) 

        self.reader = csv.reader(f, dialect=dialect, **kwds) 

 

    def __next__(self): 

        row = next(self.reader) 

        return [str(s, "utf-8") for s in row] 

 

    def __iter__(self): 

        return self 

 

 

class UnicodeWriter(object): 

 

    """ 

    A CSV writer which will write rows to CSV file "f", 

    which is encoded in the given encoding. 

    """ 

 

    def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): 

        # Redirect output to a queue 

        self.queue = io.StringIO() 

        self.writer = csv.writer(self.queue, dialect=dialect, **kwds) 

        self.stream = f 

        self.encoder = codecs.getincrementalencoder(encoding)() 

 

    def writerow(self, row): 

        self.writer.writerow([s.encode("utf-8") for s in row]) 

        # Fetch UTF-8 output from the queue ... 

        data = self.queue.getvalue() 

        data = data.decode("utf-8") 

        # ... and reencode it into the target encoding 

        data = self.encoder.encode(data) 

        # write to the target stream 

        self.stream.write(data) 

        # empty queue 

        self.queue.truncate(0) 

 

    def writerows(self, rows): 

        for row in rows: 

            self.writerow(row)