繁体   English   中英

python - 试图将 csv 文件变成更干净的 csv! Python 和 Stack 的新手

[英]python - trying to turn a csv file into a cleaner csv! new to python and Stack

我正在尝试通过 python 代码运行一个 .csv 文件,以便为我提供一个格式更好的新 csv。 我可以使用帮助,因为我编写的脚本不起作用。 我对这个东西很陌生。

我在此消息中添加了两张照片,一张是示例输入文件,另一张是所需输出文件的示例。 显然,输出文件会更容易使用,在 excel 中制作数据透视表、图表等。

我想我被困在字段列表 [0], 2 , 2等上。我也被困在这是否应该是制表符分隔或逗号分隔的文件中,因为有很多文档中的符号,随机:; , @ : - 等等。

输入文件输出文件

 person_name = '' birth_date = '' sex = '' def read_file(file_name,out_file): global person_name, birth_date, sex, date_loanrequest, date_loanreturned, type, amount, days_returned with open(file_name, 'r+') as in_file: with open(out_file, 'w+') as out_file: for line in in_file: line = line.strip() if line == "": continue fields = line.split('\\t') print(fields[0]) print(fields[1]) print(fields[2]) print(fields[3]) print(fields[4]) print(fields[5]) print(len(fields)) if line.find('Person Name') != -1: patient_name, Birth Date = fields[1], fields[2] elif line.find('Address') != -1: sex = fields[3] elif line.find('Date LoanRequest') != -1: date_loanrequest = fields[3] elif line.find('Date LoanReturned') != -1: date_loanreturned = fields[3] elif line.find('Type') != -1: type = fields[3] elif line.find('Amount') != -1: amount = fields[3] elif line.find('Days Returned') != -1: days_returned = fields[3] else: out_file.write('%s,%s,%s,%s,%s,%s,%s,%s,%s' % (person_name, birth_date, sex, date_loanrequest, date_loanreturned, type, amount, days_returned fields[0], fields[1], fields[2], fields[3], fields[4], fields[5] + '\\n')) if __name__=='__main__': '''file_name=sys.argv[1] out_file=sys.argv[2]''' file_name = 'file_name.csv' out_file = 'out_file.csv' read_file(file_name,out_file)

正如其他人所推荐的那样,有一个内置的CSV库将是您最好的选择。

还有一些其他的事情需要指出。 首先,有一种更简洁的方法可以跳过标题行。 不要每次都检查标题标题是否在当前行中,只需使用以下概念:

firstLine = True
for line in file:
   if not firstLine:
      # do work
   else:
      firstLine = False

这使得您阅读的第一行(标题)除了翻转布尔标志外什么都不做,然后从那里您不必担心。

还要记住 csv 文件总是有分隔符,即使它们之间的条目是空白的,并且 split 总是会在你的分隔符上拆分,无论它们之间是什么。 这意味着sex永远是fields[3]无论如何,它可能是空的。 要查看我在说什么,请运行以下命令:

 s = ",,,"
 s.split(',')

你会得到一个包含 4 个空元素的数组。 因此,要解决您的字段问题,请不要担心填写和未填写的内容,只需始终为每个变量分配相同的字段索引(并在需要时处理空条目)。

最后,处理分隔符。 您走在正确的轨道上,我认为最简单的方法是找到一个从未在实际文本中使用过的字符。 我推荐管道或 tildas ( | ~ ) 因为这些很可能永远不会出现在你的领域。 另一种选择是预处理文件并用分号替换所有逗号,这样您就可以使用常规逗号作为分隔符。

暂无
暂无

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

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