Python - 遍历思想目录以处理csv文件并保存它们

时间:2017-09-28 17:10:01

标签: python csv

我想浏览文件夹中的csv个文件列表,对每个文件执行一些计算(总是相同的),并为每个文件保存一个新文件。

文件具有以这种方式构建的数据:

"[Couplet 10 : Jul]
C'est 1.3.5 sur la plaque
Fais ton biz coupe ta plaque
C'est JU, JU , JUL qui débarque
Pour mes blancs , beurres et blacks
Passe moi un stunt pour voir si sa cabre
Embrouilles sur le sable , cocotiers sur la sappe
Je dors pas je suis tout pâle, je dis pas que je suis 2Pac
Je dis pas lui je vais le tuer si j'ai même pas 2 balles
C'est pour ceux qui XXX fais gaffe les shmits l'impact
Son anti B.D.H anti tapette",1

(...)

到目前为止,我有:

match = "^[\(\[].*?[\)\]]"
for d in directories:
        dir = os.path.join(data_dir, d)
        files_ = [os.path.join(dir, f) 
                      for f in os.listdir(dir) 
                      if f.endswith(".csv")]
        for f in files_:
            with open(f, 'rb') as f1, open('out.csv', 'wb') as out_file:
                reader = csv.reader(f1, delimiter='\t')
                for item in list(reader):
                item = re.sub(match, ' ', item, flags=re.MULTILINE)      
                out_file.write(item)

但是我得到了这个追溯:

File "process_csv.py", line 75, in load_data
    item = re.sub(match, ' ', item, flags=re.MULTILINE)      
  File "/Users/username/anaconda/lib/python2.7/re.py", line 155, in sub
    return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or buffer

实现这一目标的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

根据re docs,re.sub期望第三个参数为字符串。但是list(reader)会返回包含CSV字段的列表列表,而不是字符串。因此,您需要从此列表中提取字符串并将其传递给re.sub

item = re.sub(match, ' ', item[0], flags=re.MULTILINE)

或您需要在计算中使用的任何索引。

为了更好地理解它,请尝试:

test.csv: 
a 
b 
c

>>> f = open('test.csv')
>>> reader = csv.reader(f)
>>> list(reader)
[['a'], ['b'], ['c']]

<强>更新

使其处理真实数据示例:

  1. 将分隔符设置为"(默认情况下)或更改正则表达式,如果引号对于处理非常重要。
  2. 打开文件时将换行符指定为''。在python 2中open不接受newline参数,请改用io包。 io文件打开通常具有相同的签名。 CSV包文档中的说明:
  3.   

    如果未指定newline ='',则在引用字段中嵌入换行符   将无法正确解释,并且在使用\ r \ n的平台上   写入额外\ r \ n的线条将被添加。它应该永远是   安全地指定newline ='',因为csv模块自己做   (通用)换行处理。

     with open(f, 'rb', newline='') as f1, open('out.csv', 'wb', newline='') as out_file:
        ...
    
    1. 似乎第1列需要替换,因此对sub
    2. 使用item [0]

      最后,更正了代码:

      import io
      
      ...
      
      match = "^[\(\[].*?[\)\]]"
      for d in directories:
          dir = os.path.join(data_dir, d)
          files_ = [os.path.join(dir, f) 
                        for f in os.listdir(dir) 
                        if f.endswith(".csv")]
          for f in files_:
              with io.open(f, 'rb', newline='') as f1, io.open('out.csv', 'wb') as out_file:
                  reader = csv.reader(f1)
                  writer = csv.writer(out_file) 
                  for item in reader:
                      writer.writerow([
                          re.sub(match, ' ', item[0], flags=re.MULTILINE),
                          item[1]
                      ])