如何使用python仅将所需行从一个csv文件复制到另一个csv文件?

如何使用python仅将所需行从一个csv文件复制到另一个csv文件?,python,csv,Python,Csv,我正在尝试编写一个程序,仅当one.csv文件的第二列中至少有以下一个('Urology'、'Urologist'、'Urologist'、'Urologist'、'MD'、'D.name')时,才将一个.csv文件的行复制到五个.csv文件 例如: 一个.csv文件如下所示(如下所示) 现在,在运行我的代码之后,我应该得到包含以下内容的5.csv文件(如下) 只有至少包含以下内容之一的行(“泌尿科”、“泌尿科”、“泌尿科”、“MD”、“医生姓名”)才应复制到five.csv 但是,我得到了这个

我正在尝试编写一个程序,仅当one.csv文件的第二列中至少有以下一个('Urology'、'Urologist'、'Urologist'、'Urologist'、'MD'、'D.name')时,才将一个.csv文件的行复制到五个.csv文件

例如: 一个.csv文件如下所示(如下所示)

现在,在运行我的代码之后,我应该得到包含以下内容的5.csv文件(如下)

只有至少包含以下内容之一的行(“泌尿科”、“泌尿科”、“泌尿科”、“MD”、“医生姓名”)才应复制到five.csv

但是,我得到了这个

12th may    urologist           MS          urologist       very good 
12th June   urologist           MS          urologist       very good 
没有标题行,并且通过替换新文件中的D.name列,“speciality”似乎翻了一番。从昨天起我就一直试图解决这个问题,但根本没有解决办法

我该如何解决这个问题

这是我的代码:

import csv
input = open('test.csv', 'rb')
output = open('first_test.csv', 'wb')
writer = csv.writer(output)
for row in csv.reader(input):
    for row[1] in row:
        if (('Urology' in row[1]) or ('Urologist' in row[1]) or ('Urologists' in row[1]) or ('MD' in row[1]) or ('D.name' in row[1])):
            writer.writerow(row)

摆脱内部循环

for row[1] in row:
    ...
此位在这里是不必要的,您将迭代
行[1]
中的每个字符,并多次执行相同的操作

在重构代码时,我建议使用
with
语句来处理文件:

with open('test.csv', 'rb') as input, open('first_test.csv', 'wb') as output: 
    writer = csv.writer(output)
    for row in csv.reader(input):
        if (('Urology' in row[1]) or ('Urologist' in row[1]) or ('Urologists' in row[1]) or ('MD' in row[1]) or ('D.name' in row[1])):
            writer.writerow(row)

现在不必担心关闭文件。

摆脱内部循环

for row[1] in row:
    ...
此位在这里是不必要的,您将迭代
行[1]
中的每个字符,并多次执行相同的操作

在重构代码时,我建议使用
with
语句来处理文件:

with open('test.csv', 'rb') as input, open('first_test.csv', 'wb') as output: 
    writer = csv.writer(output)
    for row in csv.reader(input):
        if (('Urology' in row[1]) or ('Urologist' in row[1]) or ('Urologists' in row[1]) or ('MD' in row[1]) or ('D.name' in row[1])):
            writer.writerow(row)

您不必担心现在关闭文件。

另一种更干净的方法是将所有待搜索字符串保存在元组中,并使用任何运算符搜索所有字符串。这将避免在if条件中添加额外的条件,而只需要在预期的元组中添加新字符串

import platform
import csv

def readWrite():
  ## List all the to-be-searched strings
  expected = ('Urology', 'Urologist', 'Urologists', 'MD', 'D.name')
  with open('test.csv', 'r') as input, open('first_test.csv', 'w') as output: 
    writer = csv.writer(output)
    for row in csv.reader(input):
      ## search all strings in above listed list
      if any(string in row[1] for string in expected):
        writer.writerow(row)
  with open('first_test.csv', 'r') as f:
    print (f.read())


print("Python version : " + platform.python_version())
readWrite()
样本运行

Python version : 3.6.1
date,D.name,location,speciality,comment

12th may,sth MD,MS,urologist,very good

另一种更简洁的方法是将所有要搜索的字符串保存在一个元组中,并使用任何运算符搜索所有字符串。这将避免在if条件中添加额外的条件,而只需要在预期的元组中添加新字符串

import platform
import csv

def readWrite():
  ## List all the to-be-searched strings
  expected = ('Urology', 'Urologist', 'Urologists', 'MD', 'D.name')
  with open('test.csv', 'r') as input, open('first_test.csv', 'w') as output: 
    writer = csv.writer(output)
    for row in csv.reader(input):
      ## search all strings in above listed list
      if any(string in row[1] for string in expected):
        writer.writerow(row)
  with open('first_test.csv', 'r') as f:
    print (f.read())


print("Python version : " + platform.python_version())
readWrite()
样本运行

Python version : 3.6.1
date,D.name,location,speciality,comment

12th may,sth MD,MS,urologist,very good