首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -遍历目录来处理csv文件并保存它们。

Python -遍历目录来处理csv文件并保存它们。
EN

Stack Overflow用户
提问于 2017-09-28 17:10:00
回答 1查看 57关注 0票数 0

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

文件具有这样的数据结构:

代码语言:javascript
复制
"[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

(...)

到目前为止,我已经:

代码语言:javascript
复制
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)

但我得到了这个回溯:

代码语言:javascript
复制
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

实现这一目标的最佳途径是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-28 17:27:39

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

代码语言:javascript
复制
item = re.sub(match, ' ', item[0], flags=re.MULTILINE)

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

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

代码语言:javascript
复制
test.csv: 
a 
b 
c

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

更新

要使它处理实际数据示例,请执行以下操作:

  1. 如果引号对处理很重要,则将分隔符设置为" (默认情况下)或更改regex。
  2. 打开文件时,将换行符指定为''。在python2中,open不接受newline参数,而是使用io包。io文件打开通常具有相同的签名。来自CSV包文件的解释:

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

代码语言:javascript
复制
 with open(f, 'rb', newline='') as f1, open('out.csv', 'wb', newline='') as out_file:
    ...
  1. 第一列似乎需要替换,所以请将项用于sub

最后,修正代码:

代码语言:javascript
复制
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]
                ])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46474780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档