python:将文本文件转换为csv文件

2024-09-27 09:35:19 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我想使用Python将文本文件(in.txt)转换为csv文件(out.csv)

in.txt:

ID: 1
Name: Jon Doe
Address: 123 Main St Anytown, USA
Age: 25

输出文件out.csv应如下所示:

"ID","Name","Address","Age"
"1","Jon Doe","123 Main St Anytown, USA","25"

到目前为止,我已经做到了:

#!/usr/bin/python
#-*- coding:utf-8 -*-

import csv

f = open("in.txt")
x = f.readlines()
s = []

for i in x:
    i = i.replace(":",'"')
    j = i.replace(" ","'")
    
csvex = csv.writer(open("out.csv","w"), quoting=csv.QUOTE_ALL)
csvex.writerow(s)

我该怎么做


Tags: 文件csvnameintxtidagemain
3条回答

我的解决办法是:

with open(FILEPATH, "r") as f:
   d = zip(*[x.strip().split(":", 1) for x in f])

for l in d:
   print(",".join(["\"{:s}\"".format(str(x).strip()) for x in l]))

具体而言:

  • [x.strip().split(“:”,1)for x in f]将创建一个包含两个元素的列表,将传递的行x拆分为“:”,只强制进行一次拆分(例如,“a:1:2”。如果只进行第一次拆分,拆分(“:”,1)仍将给出一个二维列表[“a”,“1:2]”)

  • 使用*操作符解包,然后压缩,这是用于转换多维列表的一个很好的技巧。要明确的是:

    l=[['a',b',c',['d',e',f']
    列表(zip(*l))将返回[('a','d'),('b','e'),('c','f')]

  • print语句的最后一个循环只负责以所需格式输出所获得的zip对象

允许单个或多个记录的解决方案:

def read_records(fn_in, fn_out, record_size):
    with open(fn_out, 'w') as out_f:
        write_header = True
        with open(fn_in) as in_f:
            while True:
                try:
                    rec = {
                        f'"{key.strip()}"': f'"{value.strip()}"' for key, value in
                        [next(in_f).split(':') for _ in range(record_size)]
                    }
                    if write_header:
                        write_header = False
                        out_f.write(','.join(rec.keys()) + '\n')
                    out_f.write(','.join(rec.values()) + '\n')
                except StopIteration:
                    break


read_records('in.txt', 'out.csv', 4)

一些解释:

  • 所有内容都位于一个函数中,因此您可以重复使用它,并用于不同的文件和记录大小
  • while True循环永远循环,直到有一个break语句从中跳出
  • next(in_f)试图读取文件结尾以外的内容时,try .. except StopIteration会捕获
  • rec被创建为一个字典,它在您需要进一步操作值或希望在其他地方使用记录时非常方便,尽管严格来说,这不是执行任务的最有效方式

您可以使用正则表达式:

import re

data = """
ID: 1
Name: Jon Doe
Address: 123 Main St Anytown, USA
Age: 25
"""

pattern = re.compile(r'^(?P<header>[^:\n]+):\s*(?P<value>.+)', re.MULTILINE)

headers, contents = [[], []]

for m in pattern.finditer(data):
    header, content = m.groups()
    headers.append(header)
    contents.append(content)

print(headers)
print(contents)

这将产生

['ID', 'Name', 'Address', 'Age']
['1', 'Jon Doe', '123 Main St Anytown, USA', '25']

现在,您可以使用;将它们连接起来,或者使用它执行任何其他操作。请参阅表达式on regex101.com的演示

相关问题 更多 >

    热门问题