使用Python重新排列.txt行和列

使用Python重新排列.txt行和列,python,text,rows,Python,Text,Rows,我是一个非常新手的程序员,需要帮助组合和重新排列大量的.txt数据。我有500个文本文件(实际上有.pts文件,但这似乎和.txt是一样的),其中包含从使用CLM Facetracker的人的照片中提取的面部地标坐标。每张照片的输出如下(向下68行): 版本:1 n点数:68 { 216.512 146.425 217.526166.783 219.63 187.059 (……) } 这相当于: x1,y1 x2,y2 我希望重新排列它,这样所有68个地标坐标都在一行中,每个坐标之间都有一个逗号

我是一个非常新手的程序员,需要帮助组合和重新排列大量的.txt数据。我有500个文本文件(实际上有.pts文件,但这似乎和.txt是一样的),其中包含从使用CLM Facetracker的人的照片中提取的面部地标坐标。每张照片的输出如下(向下68行):

版本:1

n点数:68 {

216.512 146.425

217.526166.783

219.63 187.059

(……)

}

这相当于:

x1,y1

x2,y2

我希望重新排列它,这样所有68个地标坐标都在一行中,每个坐标之间都有一个逗号:

216.512、146.425、217.526166.783219.63187.059

x1,y1,x2,y2

有没有一个简单的方法可以做到这一点?理想情况下,我还希望添加零,以便所有地标坐标都具有相同的小数位数。提前感谢,如果我遗漏了一些非常明显的东西,请道歉:)

如果你想有一定数量的小数点,比如说4:

with open(filename, "r") as f:
    values = map(float, f.read().split())

s = []
for v in values:
    s.append("{:.4f}".format(v))

print(", ".join(s))
如果你想有一定数量的小数点,比如说4:

with open(filename, "r") as f:
    values = map(float, f.read().split())

s = []
for v in values:
    s.append("{:.4f}".format(v))

print(", ".join(s))
  • 读取文件
  • 读线
  • 用分隔符替换空白
  • 删除行尾(换行符和/或换行符)字符
  • 添加到新字符串
  • 将结果字符串写入新文件
  • 尝试使其工作(未经测试):

    一些文档:

    这可以写得更简洁,例如,参见@Nik的答案


    使用文本编辑器的搜索和替换功能,该功能支持特殊字符(空格、cr、lf)。我也能做到(还有许多其他人)

  • 读取文件
  • 读线
  • 用分隔符替换空白
  • 删除行尾(换行符和/或换行符)字符
  • 添加到新字符串
  • 将结果字符串写入新文件
  • 尝试使其工作(未经测试):

    一些文档:

    这可以写得更简洁,例如,参见@Nik的答案



    使用文本编辑器的搜索和替换功能,该功能支持特殊字符(空格、cr、lf)。我也能做到(和其他许多人一样)。

    不是每个答案都能用真实的输入文件。实际上,我理解包含
    npoints:68{
    等。所以,让我试试


    输入文件:

    version: 1
    npoints: 68 {
    216.512 146.425
    217.526 166.783
    219.63 187.059
    }
    
    看起来圆点只作为小数点出现。我假设

    输出:

    216.512、146.425、217.526166.783219.63187.059


    纯sed:

    sed-E:a;N;$!ba;s/\N//g;s/[^^0-9^.]///g;s/[^0-9]+[^.]+[^0-9][]///g;s/[]+$///g;'testData

    这可能不是美,但好吧……我只需要检查一下我是否还记得正则表达式。看起来我应该改进它,但至少——它是有效的


    Python:

    with open("testData.txt", "r") as f:
        data = f.read().split()
    data = [ x for x in data if "." in x ]
    print(", ".join(data))
    

    并不是每个答案都能用真实的输入文件。通过真实,我理解包含
    npoints:68{
    等。所以,让我试试


    输入文件:

    version: 1
    npoints: 68 {
    216.512 146.425
    217.526 166.783
    219.63 187.059
    }
    
    看起来圆点只作为小数点出现。我假设

    输出:

    216.512、146.425、217.526166.783219.63187.059


    纯sed:

    sed-E:a;N;$!ba;s/\N//g;s/[^^0-9^.]///g;s/[^0-9]+[^.]+[^0-9][]///g;s/[]+$///g;'testData

    这可能不是美,但好吧……我只需要检查一下我是否还记得正则表达式。看起来我应该改进它,但至少——它是有效的


    Python:

    with open("testData.txt", "r") as f:
        data = f.read().split()
    data = [ x for x in data if "." in x ]
    print(", ".join(data))
    

    你真的需要python吗?你可能有Linux吗?这就像awk手册;)不需要python不:)只是默认为那样,因为我的项目管道的其余部分使用python,这就是我的slim体验。不幸的是,没有Linux。肯定只使用awk.:)你真的需要python吗?你可能有Linux吗?这就像来自awk手册;)不需要Python否:)只是默认为那样,因为我的项目管道的其余部分使用Python,这正是我的超薄体验所在。不幸的是,没有Linux。肯定只需要使用awk即可。:)非常感谢。除了将#格式设置为小数点后3位之外,我的一切都正常工作了。它返回:data#u list=[”{0:.3f}”.data_list]Traceback中dl的格式(float(dl))(最近一次调用最后一次):文件“”,第1行,文件“”,第1行,值中错误:无法将字符串转换为float:'version:'我可能缺少一些明显的内容,如果您有空字符串、空格、换行符等,则
    float()
    将引发错误。您需要清理列表理解中的数据。或者您可以添加一个try:except块来跳过无效数据。非常感谢。除#格式保留到小数点后3位外,我已使所有内容正常工作。它返回:data#list=[“{0:.3f}”。data#list]回溯中dl的格式(float(dl))(最近一次调用最后一次):文件“”,第1行,在文件“”中,第1行,在ValueError:无法将字符串转换为float:“version:'我可能缺少一些明显的内容。如果您有空字符串、空格、换行符等,则
    float()
    将抛出错误。您需要清理列表中的数据。或者您可以添加try:except块以跳过无效数据。