写入具有特定列数的文件

Posted

技术标签:

【中文标题】写入具有特定列数的文件【英文标题】:Write file with specific number of columns 【发布时间】:2021-04-21 15:50:32 【问题描述】:

我需要编写一个具有特定列数的文本文档(在这种情况下总是有 16 个)。我发现实现这一点的方法是:检查我想要的值所在的数组(列表)的 len,然后除以 16,得到足以精确等于 16 列的行数。当然,有一种更正确的方法来优化这个过程。 我利用来问的另一个问题是(因为我真的不知道该怎么做):如何在 16 列中写入并始终留下与该数组的最大数量相等的缩进(即:8500 = 4 个字符= 4 个空格)。像这样的:

Example

这是我的代码:

f = open('Questions.txt','r')

my_list = [line.split(',')[0]  for line in f]

ff = open('Questions_new.txt','w')

i=0
x=len(my_list)

rows = int(round(len(my_list)//16))

for i in range(rows):
   row = my_list [i::rows]
   ff.write(' '.join(str(x) for x in row)+'\n')

使用line.split是因为我从一个文本文档(下面的例子)中提取一个文本文档的所有字符,直到找到一个逗号:

1213,4214 12312

13,1231 123

45,343

他只是为我保留信息:

1213

13

45

如果有人可以帮助我将不胜感激。

【问题讨论】:

【参考方案1】:

下面是一些我会想到的代码行:

my_list = [ '12',   '34',    '3467',
            '1234', '34',    '34',
            '123',  '34567', '345',
            '23',   '78'] # your input list
ncolumns = 3 # specify desired number of columns

my_list += [""]*(ncolumns-len(my_list)%ncolumns) # make list multiple of ncolumns
my_list = [my_list[i:i+ncolumns] for i in range(0,len(my_list),ncolumns)] # reshape in rows
rowformat = (": "*ncolumns).format(*(max(map(len,col)) for col in zip(*my_list))) # format of row text
with open("outputfile.txt","w") as fid:
    fid.write("\n".join(rowformat.format(*row) for row in my_list))

就像python中的很多东西一样,有很多不同的方法可以实现同样的事情,所以必须指定“肯定有更正确的方法来优化这个过程”的含义:你的意思是最少的行数的代码?最节省内存?最易读?根据您对“正确”的定义,您的代码可能比我的更正确;)

在此示例中,列宽是通过字符串格式语法实现的,请参见例如python-docs。有了它,您还可以轻松调整列的对齐方式等。

【讨论】:

【参考方案2】:

回答您的第一个问题关于行数,我认为您的方法非常有效。另一种结构方式包括:

有一个 while 循环,它在每次迭代中从文本文件中读取一个新值。在 while 循环中,为 n_rowsn_cols 保留一个计数器。 将新值写入到当前行右侧的output[n_rows][n_cols] 的输出中 如果n_cols == 16,增加n_row++

关于您的第二个问题,您可以:

首先读取所有值,并将它们存储到一个数组中 向数组添加新值时,将位数与当前最大位数进行比较 将数组中的值复制到输出文本文件中,填充到最大位数

【讨论】:

以上是关于写入具有特定列数的文件的主要内容,如果未能解决你的问题,请参考以下文章

Rcpp 创建具有可变列数的 DataFrame

Android:具有动态列数的列表视图

Pyspark:将df写入具有特定名称的文件,绘制df

python把数据写入文件,规定每个文件只有固定行数

SQL Server中具有不同列数的多个查询的联合结果

如何在 R 中读取具有不同列数的 CSV 文件