Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-替换CSV文件中的斜杠_Python_Csv - Fatal编程技术网

Python-替换CSV文件中的斜杠

Python-替换CSV文件中的斜杠,python,csv,Python,Csv,我有一个csv文件,大约有100行。100行中的某些单元格具有如下文件路径: C:\\\\Users\\\Simon\\\\Desktop\\\\file.jpg 我想用python打开csv文件,只更改具有三个斜杠的行,并将它们转换为一个反斜杠。以下是我目前的代码: import csv with open('myCsvFile', 'rb') as csvfile: SysIndexTwo = csv.reader(csvfile) for allRows in SysInde

我有一个csv文件,大约有100行。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
回溯(最近一次呼叫最后一次):
文件“虹吸2.py”,第7行,在
对于SysIndexTwo中的所有行:
ValueError:对关闭的文件执行I/O操作
simon@ubuntu:~/Desktop$2.py
回溯(最近一次呼叫最后一次):
文件“虹吸2.py”,第7行,在
对于SysIndexTwo中的所有行:
ValueError:对关闭的文件执行I/O操作
这似乎不起作用。有什么想法吗

谢谢

试试:

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

您试图匹配的斜杠被视为转义符,因此
'\\\'
实际上是在寻找
'\\'

尝试使用原始字符串,即
r'\\\\'
(您将希望对匹配和替换都使用原始字符串)


您还可以将斜杠加倍,因此每次需要时都使用
\\
,但这会很快变得很麻烦,您需要缩进实际处理。现在,在尝试使用上下文管理器(定义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
,但如果它是在其他地方的上下文管理器中定义的,那么它可能会遇到与您的读者相同的问题

最后,是你的朋友(尽管他们在这里对你帮助不大)。一般来说,只要您想在字符串中使用文字反斜杠,就在字符串前面加一个
r
,这样可以省去很多麻烦但是,替换奇数个反斜杠仍然是一个问题,因为即使是原始字符串也不能以奇数个反斜杠结尾

因此,要将
\\\\
替换为
\
(用一个反斜杠替换三个反斜杠),您必须像我在上面的示例中那样加倍反斜杠。如果您想用两个反斜杠替换四个反斜杠,您可以使用原始字符串:
cell.replace(r'\\\\',r'\\')
工作正常


对于后代:您也可以做一些同样丑陋的事情,但方式不同,在模式字符串的末尾添加一个空格,使它们不再以反斜杠结尾,然后去掉多余的空格。下面的一行用一个反斜杠替换了三个反斜杠,但是它更粗糙(如果你经常这样做,那么速度会更慢):


在你的迭代中,你有四个斜杠,而不是三个。很明显,你根本没有重新研究这个问题,因为你一直在编辑你的问题。请参阅with语句、文件和转义特殊字符上的文档。您必须使用代码的最后三行,在
with
语句之外,文件自动关闭。您在这里至少有三个不同的问题:错误消息是Steinar和Henry解释的;如果不清楚是否有3个或4个反斜杠,则无法编写正确的代码;如果不使用原始字符串,即使在正确计数的情况下,也很难编写(和读取)代码。仅仅解决这三个问题中的一个并不能神奇地解决另外两个问题;你需要修复所有这些问题。虽然这应该是可行的,但这不是一个好建议;原始字符串使所有内容更易于阅读。而OP的全部问题似乎是,有太多的斜杠让他无法正确计算,所以这在这里非常重要…
s = r'This is a \\\ string with \\\ sets \ of \\ three backslash\\\es.'
print(s.replace(r'\\\ '.strip(), r'\ '.strip()))