Python 管道分隔符文件,但没有管道内部数据 问题
我需要将文本从逗号(Python 管道分隔符文件,但没有管道内部数据 问题,python,Python,我需要将文本从逗号(,)分隔值重新格式化为管道(|)分隔值。原始(逗号分隔)文本值内的管道字符应替换为(管道分隔)结果文本中表示的空格 管道分隔结果文本应写回读取原始逗号分隔文本的同一文件 我正在使用python 2.6 可能的解决办法 我应该先阅读该文件并删除其中带有空格的所有管道,然后将(,)替换为(|) 有没有更好的方法来实现这一点?听起来您正在尝试使用CSV的变体—在这种情况下,这可能就是您所需要的。您可以将其与自定义分隔符一起使用,它将为您自动处理转义(此示例已从手册中删除并修改):
,
)分隔值重新格式化为管道(|
)分隔值。原始(逗号分隔)文本值内的管道字符应替换为(管道分隔)结果文本中表示的空格
管道分隔结果文本应写回读取原始逗号分隔文本的同一文件
我正在使用python 2.6
可能的解决办法
我应该先阅读该文件并删除其中带有空格的所有管道,然后将(,
)替换为(|
)
有没有更好的方法来实现这一点?听起来您正在尝试使用CSV的变体—在这种情况下,这可能就是您所需要的。您可以将其与自定义分隔符一起使用,它将为您自动处理转义(此示例已从手册中删除并修改):
还有修改引用、转义和其他选项的方法。阅读也同样有效 听起来像是在尝试使用CSV的变体——在这种情况下,这可能就是您所需要的。您可以将其与自定义分隔符一起使用,它将为您自动处理转义(此示例已从手册中删除并修改):
还有修改引用、转义和其他选项的方法。阅读也同样有效 不要重新发明以值分隔的文件解析轮。使用来为您进行解析和编写
csv
模块将在包含分隔符的值周围添加“…”
引号,因此原则上不需要替换值中的管道符号。要替换原始文件,请写入新的(临时)输出文件,然后将其移回原位
import csv
import os
outputfile = inputfile + '.tmp'
with open(inputfile, 'rb') as inf, open(outputfile, 'wb') as outf:
reader = csv.reader(inf)
writer = csv.writer(outf, delimiter='|')
writer.writerows(reader)
os.remove(inputfile)
os.rename(outputfile, inputfile)
对于包含以下内容的输入文件:
foo,bar | baz,垃圾邮件
这就产生了
foo |“bar | baz”|垃圾邮件
请注意,中间的列用引号括起来
如果确实需要替换值中的|
字符,则可以在复制行时执行此操作:
outputfile = inputfile + '.tmp'
with open(inputfile, 'rb') as inf, open(outputfile, 'wb') as outf:
reader = csv.reader(inf)
writer = csv.writer(outf, delimiter='|')
for row in reader:
writer.writerow([col.replace('|', ' ') for col in row])
os.remove(inputfile)
os.rename(outputfile, inputfile)
现在,我的示例的输出变成:
foo | bar baz |垃圾邮件
不要重新发明以值分隔的文件解析轮。使用来为您进行解析和编写
csv
模块将在包含分隔符的值周围添加“…”
引号,因此原则上不需要替换值中的管道符号。要替换原始文件,请写入新的(临时)输出文件,然后将其移回原位
import csv
import os
outputfile = inputfile + '.tmp'
with open(inputfile, 'rb') as inf, open(outputfile, 'wb') as outf:
reader = csv.reader(inf)
writer = csv.writer(outf, delimiter='|')
writer.writerows(reader)
os.remove(inputfile)
os.rename(outputfile, inputfile)
对于包含以下内容的输入文件:
foo,bar | baz,垃圾邮件
这就产生了
foo |“bar | baz”|垃圾邮件
请注意,中间的列用引号括起来
如果确实需要替换值中的|
字符,则可以在复制行时执行此操作:
outputfile = inputfile + '.tmp'
with open(inputfile, 'rb') as inf, open(outputfile, 'wb') as outf:
reader = csv.reader(inf)
writer = csv.writer(outf, delimiter='|')
for row in reader:
writer.writerow([col.replace('|', ' ') for col in row])
os.remove(inputfile)
os.rename(outputfile, inputfile)
现在,我的示例的输出变成:
foo | bar baz |垃圾邮件
您可以从替换了管道字符的原始文件创建一个临时文件,然后在处理完成后用它替换原始文件:
import csv
import tempfile
import os
filepath = 'C:/Path/InputFile.csv'
with open(filepath, 'rb') as fin:
reader = csv.DictReader(fin)
fout = tempfile.NamedTemporaryFile(dir=os.path.dirname(filepath)
delete=False)
temp_filepath = fout.name
writer = csv.DictWriter(fout, reader.fieldnames, delimiter='|')
# writer.writeheader() # requires Python 2.7
header = dict(zip(reader.fieldnames, reader.fieldnames))
writer.writerow(header)
for row in reader:
for k,v in row.items():
row[k] = v.replace('|'. ' ')
writer.writerow(row)
fout.close()
os.remove(filepath)
os.rename(temp_filepath, filepath)
可以从替换了管道字符的原始文件创建临时文件,然后在处理完成后将原始文件替换为临时文件:
import csv
import tempfile
import os
filepath = 'C:/Path/InputFile.csv'
with open(filepath, 'rb') as fin:
reader = csv.DictReader(fin)
fout = tempfile.NamedTemporaryFile(dir=os.path.dirname(filepath)
delete=False)
temp_filepath = fout.name
writer = csv.DictWriter(fout, reader.fieldnames, delimiter='|')
# writer.writeheader() # requires Python 2.7
header = dict(zip(reader.fieldnames, reader.fieldnames))
writer.writerow(header)
for row in reader:
for k,v in row.items():
row[k] = v.replace('|'. ' ')
writer.writerow(row)
fout.close()
os.remove(filepath)
os.rename(temp_filepath, filepath)
对于那些相信不给解释就投反对票的家伙,去享受生活吧。请其他人在下面发表评论,让我知道如果我问的是论坛中可能存在的任何问题或没有提供足够的数据,你可以逐行阅读文件,然后用逗号拆分,并在拆分获得的值内替换每个
,然后,只需将修改后的值与|
@mic4ael连接起来,如果我读取文件并将(,)替换为(|),那么在检查不应包含管道的数据时,将可能删除所有管道。对于那些相信向下投票而不给出解释的家伙,去争取生命吧。请其他人在下面发表评论,让我知道如果我问的是论坛中可能存在的任何问题或没有提供足够的数据,你可以逐行阅读文件,然后用逗号拆分,并在拆分获得的值内替换每个
,然后只需将修改后的值与|
@mic4ael连接即可。如果我读取文件并将(,)替换为(|),则在检查不应包含管道的数据时,可能会删除所有管道。我收到权限被拒绝错误,bcos我没有权限访问系统的临时目录。与公司一起使用windowssecurity@cyborg:然后使用不同的临时目录;您可以在运行tempfile.NamedTemporaryFile()
之前设置tempfile.tempdir
@cyborg:或使用open(inputfile+'.tmp',wb')
作为临时输出文件,然后使用os.rename(inputfile+'.tmp',inputfile)
将该文件移回原来的名称。@cyborg:我已经更新了答案,使用后一种方法;对于这种类型的作业,它可能更简单。上面的代码将给出文件已经存在的错误。我试图格式化代码,但仍然存在错误。“”无法创建已存在的文件“”。在Python2.6中,以这种方式打开文件会产生错误,所以我尝试在第一个文件中嵌套其他打开,但同样的错误我得到了权限拒绝错误,bcos我没有权限访问系统的临时目录。与公司一起使用windowssecurity@cyborg:然后使用不同的临时目录;您可以在运行tempfile.NamedTemporaryFile()
之前设置tempfile.tempdir
@cyborg:或使用open(inputfile+'.tmp',wb')
作为临时输出文件,然后使用os.rename(inputfile+'.tmp',inputfile)
将该文件移回原来的名称。@cyborg:我已经更新了答案,使用后一种方法;对于这种类型的作业,它可能更简单。上面的代码将给出文件已经存在的错误。我试图格式化代码,但仍然存在错误。“”无法创建已存在的文件