【问题标题】:how to write in next row using python?如何使用python在下一行写入?
【发布时间】:2011-08-10 20:32:57
【问题描述】:

1234 5678 9876 542 1231; 2333 1234 5678 579

我想将此数据从 .txt (murtuz.txt) 文件写入 csv (myfile.csv) 文件中,以便在分号后从下一行开始。

我已经尝试过下面提到的代码,它可以帮助我将数据写入 csv 文件,但我无法更改分号后的行。

import csv  
from StringIO import StringIO
import sys

data = open("murtuz.txt","r").read()  
data1 = StringIO(data)  
print data1          
reader = csv.reader(data1, delimiter=' ',)     
for row in reader:  
    print row  

out = csv.writer(open("myfile.csv","w"), delimiter=',')  
out.writerow(row)  
sys.exit()

需要一些专家的帮助。
提前致谢。

【问题讨论】:

  • 这是一个玩具例子吗?如果没有csv 模块,这样做可能会更容易。

标签: python file-io csv


【解决方案1】:

csv.reader 可以接受任何可迭代的作为输入。特别是,您可以将生成器产生的行提供给它。您可以使用该生成器来处理您的输入数据——例如,以分号分割:

input csv
input textwrap
input io

def splitter(iterable):
    for line in iterable:
        for part in line.split(';'):
            yield part.strip()

f=open("murtuz.txt","r")
# with open("murtuz.txt","r") as f:     # for Python 2.6 or better
    csvobj=csv.reader(splitter(f),delimiter=' ')
    for row in csvobj:
        print(row)
f.close()

产量

['1234', '5678', '9876', '542', '1231']
['2333', '1234', '5678', '579']
['1234', '5678', '9876', '542', '1231']
['2333', '1234', '5678', '579']

一旦你控制了阅读器,再写出来就很容易了。

【讨论】:

  • 我不能在 python 2.5 中使用'with'
  • @mama:在这种情况下,使用f=open(...)
【解决方案2】:

根据the docs

阅读器被硬编码以将 '\r' 或 '\n' 识别为行尾,并忽略换行符。这种行为将来可能会改变。

因此您不能告诉读者将分号视为行终止符。

你可以这样做:

import csv  

data = open("murtuz.txt").readlines()
outfile = open("myfile.csv","w")
out = csv.writer(outfile)
for row in data:
    row = row.strip().split(';')
    if row:
        for subrow in row:
            subrow = subrow.strip().split()
            if subrow:
                out.writerow(subrow)
outfile.close()

这适用于每行任意数量的分号。

【讨论】:

  • 非常感谢它的工作原理:) 但我不知道为什么它在两者之间留下一行空白:S
  • 试试修改后的版本。另外,如果我的回答对你有帮助,请点击旁边的勾号接受。
  • 它没有做任何改变:(
  • 我无法复制该问题。当我使用您的示例数据时,我没有得到任何空行,即使我在末尾添加换行符等,或者在两者之间添加空行。请接受我的回答,或在<pre></pre> 中使用输入文件的大部分内容编辑您的问题
  • 好的,感谢您的支持,我已经接受了您的回答。
【解决方案3】:

我会解析这条线。

newrow = str(row)
if ';' in newrow:
  fragments = newrow.split(';')
for each_fragment in fragments:
  out.writerow(each_fragment)

这行得通吗?

【讨论】:

  • 你不能这样做:newrow = str(row)
  • 没有?这就像做str(['a', 'b', 'c;', 'd', 'e']) 然后在分号处拆分。您将不再有列表,您将拥有"['a', 'b', 'c""', 'd', 'e']"csvwriter 怎么知道如何解析它?
  • line.split 是什么意思?
  • newrow.split(';'),将为您拆分行。
【解决方案4】:

试试:

full_file_txt = open("murtz.txt").read() #this is ugly and brute force
rows = full_file_txt.split(";") #split txt file into rows delim by ;
for row in rows:  
    print ",".join(row.split()) #split each row on space, and output as csv

【讨论】:

  • 使用 @untubu 答案 - 更整洁,避免使用生成器暴力读取 txt 文件。
猜你喜欢
  • 2020-06-19
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 2020-03-06
相关资源
最近更新 更多