繁体   English   中英

从python中的csv文件中删除某些字符时输出错误

[英]wrong output in removing certain characters from a csv file in python

我有一个csv文件(以;作为分隔符),其中存在某些要删除的字符。 我的数据示例是:

PREDNISOLONE ACETATE 100MG/ML INJ,SUSP [VA Product];PREDNISOLONE ACETATE 100MG/ML INJ,SUSP [VA Product]
ACETAMINOPHEN 160MG/5ML (ALC-F) SUSP [VA Product];ACETAMINOPHEN 160MG/5ML (ALC-F) SUSP [VA Product]
NITISINONE 2MG CAP [VA Product];NITISINONE 2MG CAP [VA Product]
TRIMETHAPHAN CAMSYLATE;TRIMETHAPHAN CAMSYLATE
CAFFEINE 100MG TAB [VA Product];CAFFEINE 100MG TAB [VA Product]
CASTOR OIL [VA Product];CASTOR OIL [VA Product]

如您所见,数据的某些部分周围有[]() ,我想删除它们以及它们之间的所有数据。 因此,在以上示例中, [VA Product](ALC-F)将被删除。 我写了这段代码,但是产生了错误的输出:

input = open('input_file1.csv', 'r')
    lines = csv.reader(input)
    output = open('output_file1.csv', 'w')
    writer = csv.writer(output)

    conversion = '()[]{}'
    text = input.read()
    newtext = ''
    for c in text:
        newtext += '' if c in conversion else c
        writer.writerow(c)

    input.close()
    output.close()

我在这里犯了什么错误,正确的方法是什么?

您可以在每个列条目上使用正则表达式来删除括号之间的文本。 它还从结果文本中删除所有双精度空格:

import csv
import re

with open('input.csv', 'rb') as f_input, open('output.csv', 'wb') as f_output:
    csv_input = csv.reader(f_input, delimiter=';')
    csv_output = csv.writer(f_output)

    for row in csv_input:
        csv_output.writerow([re.sub(r'([\(\[].*?[\)\]])', '', c).strip().replace('  ', ' ') for c in row])

这将导致以逗号分隔的output.csv文件,如下所示:

"PREDNISOLONE ACETATE 100MG/ML INJ,SUSP","PREDNISOLONE ACETATE 100MG/ML INJ,SUSP"
ACETAMINOPHEN 160MG/5ML SUSP,ACETAMINOPHEN 160MG/5ML SUSP
NITISINONE 2MG CAP,NITISINONE 2MG CAP
TRIMETHAPHAN CAMSYLATE,TRIMETHAPHAN CAMSYLATE
CAFFEINE 100MG TAB,CAFFEINE 100MG TAB
CASTOR OIL,CASTOR OIL

注意:这与方括号不符,假设[abc)不存在。 还添加delmiter=';' 如果需要,请发送给csv.writer


要在第一个逗号后也删除所有内容,可以对脚本进行如下修改:

import csv
import re

with open('input.csv', 'rb') as f_input, open('output.csv', 'wb') as f_output:
    csv_input = csv.reader(f_input, delimiter=';')
    csv_output = csv.writer(f_output, delimiter=';')

    for row in csv_input:
        csv_output.writerow([re.sub(r'([\(\[].*?[\)\]])', '', c).strip().replace('  ', ' ').split(',', 1)[0] for c in row])

给予:

PREDNISOLONE ACETATE 100MG/ML INJ;PREDNISOLONE ACETATE 100MG/ML INJ
ACETAMINOPHEN 160MG/5ML SUSP;ACETAMINOPHEN 160MG/5ML SUSP
NITISINONE 2MG CAP;NITISINONE 2MG CAP
TRIMETHAPHAN CAMSYLATE;TRIMETHAPHAN CAMSYLATE
CAFFEINE 100MG TAB;CAFFEINE 100MG TAB
CASTOR OIL;CASTOR OIL

input.read()读取文件的全部内容。 因此, for c in text的行将遍历文件中的字符,而不是csv的每一行。

您制作了一个名为lines的csv阅读器,然后根本没有使用它,因此从这里开始。 但是,您也不想使用writer.writerow(c) ,因为您不想为每个字符添加新行。

同样,您声明了newtext并以一种看似合理的方式构建它,但是随后您不使用它–我认为您需要writer.writerow(newtext) ,但请注意,您希望在循环之外使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM