我有一个大约有100行的csv文件。 100行中的一些单元格具有如下文件路径:
C:\\\\Users\\\Simon\\\\Desktop\\\\file.jpg
我想在python中打开csv文件,只更改具有三斜线的行并将它们转换为单个反斜杠。到目前为止,这是我的代码:
import csv
with open('myCsvFile', 'rb') as csvfile:
SysIndexTwo = csv.reader(csvfile)
for allRows in SysIndexTwo:
if '\\\\' in allRows:
writer.writerows(allRows.replace('\\\\', '\\'))
尝试了建议并收到以下错误:
Traceback (most recent call last):
File "SIPHON2.py", line 7, in <module>
for allRows in SysIndexTwo:
ValueError: I/O operation on closed file
simon@ubuntu:~/Desktop$ python SIPHON2.py
Traceback (most recent call last):
File "SIPHON2.py", line 7, in <module>
for allRows in SysIndexTwo:
ValueError: I/O operation on closed file
这似乎不起作用。有什么想法吗?
由于
答案 0 :(得分:3)
您需要缩进实际处理。现在,在尝试使用它之前,您将退出上下文管理器(您定义CSV阅读器的with
语句)。因此,您得到“关闭文件上的IO操作”错误,因为上下文管理器在您离开文件时关闭了文件。
你想要这个:
with open('myCsvFile', 'rb') as csvfile:
reader = csv.reader(csvfile) # Simple names are good, esp. in small scope!
for row in reader: # Indent me!
pass # Do stuff here.
with
语句对于自动关闭文件(以及其他内容)非常方便。但是,这意味着您执行的任何工作都需要在您离开块之前完成您正在使用的文件,因为一旦您离开,文件就会关闭!
初始化时,csv阅读器不会读取整个文件:它会按需读取。因此,当您从csv阅读器读取行时,您仍需要在块内。
其他笔记
你有很多其他问题。您似乎不确定是否要尝试清除三个或四个反斜杠 - 确保在尝试之前知道自己在做什么!
你的实际行替换被破坏了,因为正如你所写,allRows
是一个列表,而不是一个字符串,所以你可能不会找到你正在寻找的反斜杠模式。相反,您需要一个内部循环来查看每一行中的每个单元格:
for row in reader:
corrected = []
for cell in row:
corrected.append(cell.replace('\\\\\\', '\\')) # Gross! See below.
writer.writerow(corrected)
请注意,我看不到定义writer
的位置,但看起来它可能会遇到与读者相同的问题,如果它在其他地方的上下文管理器中定义的话!
最后,raw strings是你的朋友(尽管他们在这里可能对你没什么帮助)。一般情况下,只要你想在字符串中使用文字反斜杠,就可以在字符串前放一个r
来节省很多麻烦。 但是,替换奇数个反斜杠仍然是个问题,因为甚至原始字符串都不能以奇数个反斜杠结尾。
因此,要用\\\
替换\
(用一个替换三个反斜杠),你必须像我在上面的例子中那样加倍反斜杠。如果你想用两个替换四个反斜杠,你可以使用原始字符串:cell.replace(r'\\\\', r'\\')
工作得很好。
对于后人:你也可以做一些丑陋的事情,但是以不同的方式,通过在模式字符串的末尾添加一个空格,使它们不再以反斜杠结束,然后剥去额外的空间。下面的行用一个替换三个反斜杠,但是它更加粗俗(如果你做了很多的话,速度会慢一些):
s = r'This is a \\\ string with \\\ sets \ of \\ three backslash\\\es.'
print(s.replace(r'\\\ '.strip(), r'\ '.strip()))
答案 1 :(得分:1)
您尝试匹配的斜杠被视为转义,因此'\\\\'
实际上正在寻找'\\'
。
尝试使用原始字符串,即r'\\\\'
(您将要使用原始字符串进行匹配以及替换)。
你也可以加倍斜杠,所以每次你想\\
使用\
,但这很快就会变得麻烦
答案 2 :(得分:0)
尝试:
allRows.replace('\\\\\\', '\\')
请注意,\
符号需要通过加倍来转义。
>>> d
'C:\\\\\\Users\\\\\\Simon\\\\\\Desktop\\\\\\file.jpg\n'
>>> d.replace('\\\\\\', '\\')
'C:\\Users\\Simon\\Desktop\\file.jpg\n'
>>> print d.replace('\\\\\\', '\\')
C:\Users\Simon\Desktop\file.jpg