我想浏览文件夹中的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
实现这一目标的最佳方式是什么?
答案 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']]
<强>更新强>
使其处理真实数据示例:
"
(默认情况下)或更改正则表达式,如果引号对于处理非常重要。''
。在python 2中open
不接受newline
参数,请改用io
包。 io
文件打开通常具有相同的签名。 CSV包文档中的说明:如果未指定newline ='',则在引用字段中嵌入换行符 将无法正确解释,并且在使用\ r \ n的平台上 写入额外\ r \ n的线条将被添加。它应该永远是 安全地指定newline ='',因为csv模块自己做 (通用)换行处理。
with open(f, 'rb', newline='') as f1, open('out.csv', 'wb', newline='') as out_file:
...
sub
最后,更正了代码:
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]
])