使用python2.x读入并格式化文本文件

2024-06-23 19:14:31 发布

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

如果文本文件中的数据如下所示:

# this is a header
# and so is this
#
alligator 27.2 83.4
bear 23.9 90.2
cat 12.56 0.98
dog 15.97 0.88884
...
...

…我知道我可以使用以下代码块在(列出与数据行相对应的列表)中读取该数据:

^{pr2}$

……但我的直觉告诉我,有一种更优雅的方式来完成这项任务。基本上,我希望逐行读入文件,忽略'#'s,并为命令行中的每个元素提供一个'format'(例如[“%s”、“%0.6f”、“%0.6f”、“%0.6f”、“%I”]或其他东西…我将始终事先知道这一点)。最好的做法是什么?在


Tags: and数据代码列表soisthiscat
3条回答
file1_data = []
with open(file1) as data_input: # with automatically closes your files
    # skip headers 
    next(data_input), next(data_input), next(data_input)
    for line in data_input:
        # unpack 
        first_col_datum, second_col_datum, third_col_datum = line.split()
        file1_data.append([first_col_datum,float(second_col_datum), float(third_col_datum)])

输出:

^{pr2}$

或使用itertools.islice跳过标题:

from itertools import islice

with open(file1) as data_input:
    for line in islice(data_input,3,None):
        first_col_datum, second_col_datum, third_col_datum = line.split()
        file1_data.append([first_col_datum,float(second_col_datum),float(third_col_datum)])

print(file1_data)
[['alligator', 27.2, 83.4], ['bear', 23.9, 90.2], ['cat', 12.56, 0.98], ['dog', 15.97, 0.88884]]

我不确定我完全理解格式化部分或你想用它做什么,但如果你想格式化使用str.格式公司名称:

^{4}$

如果试图使用If语句忽略以#开头的行,则应使用str.startswith

if not line.startswith("#")

不确定您的问题中的哪一处表示要将数据写入文件,但如果您这样做:

from itertools import islice

with open(file1) as data_input, open("output.txt","w") as out:
    for line in islice(data_input,3,None):
        first_col_datum, second_col_datum, third_col_datum = line.split()
        out.write("{} {:6f} {:6f}\n".format(first_col_datum,float(second_col_datum), float(third_col_datum)))

最简单的方法是通过列表理解中的lambda或使用map函数的lambda

desired_list = lambda str_list: [str_list[0], float(str_list[1]), float(str_list[2])]
# With list comprehension
with open(file1) as fo:
    output_list = [desired_list(content.strip().split(" ", 3) for content in fo.read().split("\n") if content and '#' not in content]

# With filter and map function
output_list = []
with open(file1) as fo:
    fitered_list = filter(lambda x: if x and '#' not in x, fo.read().split("\n"))
    output_list = map(desired_list, filtered_list)

我更喜欢将逻辑放入一个函数并调用它,而不是使用lambda,就像padraiccunningham一样。在

^{pr2}$

与其他两种方法相比,这种方法几乎可以控制逻辑。在

如果你想写在文件中间使用

fileinput module。在

import fileinput
for line in fileinput.input("C:\\Users\\Administrator\\Desktop\\new.txt",inplace=True):
    if not re.match(r"^#.*$",line):
        #do the formatting
        print "something", #print("something", end ="") for python 3

几行就完成了

记住你打印的任何东西文件。所以你必须阅读和打印每一行,并修改你想修改的任何一行替换。还有使用print "asd",结尾的,很重要,因为它会阻止{}在那里放一个新行。在

现在你不看lines starting with}`。在

所以加上条件。在

^{pr2}$

相关问题 更多 >

    热门问题