如何读入.ascii文件并进行转换?(Python)

2024-05-17 05:25:59 发布

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

我有一些.ascii文件。在Excel中打开的前几行如下所示:

>ETASAsciiItemFile  record  CrLf    Tab
>sampleCount    22327       
>time   sys_inp_amb_temp_degc\CCP:1     
>f8 f4      
>s  °C      
>0,454984023542835  235,938     
>0,671164096921757  235,938     

我需要能够提供“正常”的数字。转换为csv是理想的。在

这是我所拥有的-我是

^{pr2}$

我知道,我应该把这些位放入函数中,我会的。我只是想快点把它弄脏。在

以下是我当前输出的外观:

>"ETASAsciiItemFile record  CrLf    Tab"        
>"sampleCount   22327          "        
>"time  sys_inp_amb_temp_degc\CCP:1 "       
>"f8    f4  "       
>"s ""°C""  "       
>0  "454984023542835    23" "5938   "
>0  "671164096921757    23" "5938   "
  • 显然,因为我告诉它要像unicode一样打开它,这是个问题。不过,它拒绝使用ASCII作为选项。

  • 另外,它决定那些逗号是分隔符。也是个问题。

有什么想法吗?Excel选项而不是Python选项是完全受欢迎的。在


Tags: ccptime选项sysrecordexceltabtemp
2条回答

unicode只是文件名。它对文件的内容没有任何影响。在

你正在读写二进制文件。从这个问题上还不清楚这是否是你真正想要的。在

这条线上有一个有点狡猾的错误:

path_plus_title1 = (fname1.strip('.ascii')) +'.csv'

strip()没有做你认为的那样。它会将字符串末尾的所有字符从请求删除的集合中删除。因此,如果fname1'isac.ascii',那么{}将生成空字符串!在

最后,这是我真正的猜测,因为你的问题不清楚,你会想把“0671164096921757”转换成“0.671164096921757”。换句话说,您的数据是在使用逗号作为十进制分隔符的区域设置中生成的,但您希望将其转换为使用点作为十进制分隔符的区域设置。在

您可能希望在阅读代码中进行的第一个更改是指定分隔符。默认情况下是逗号,它将数据分成不同的单元格。在

有一种确定的方法可以转换逗号,另一种可能的方法我还没有测试过。肯定的方法是在读写数据之间添加代码,检查内存中的数据,识别数字+逗号+数字的模式,然后自己转换。在

另一种可能的方法是将区域设置更改为逗号为十进制分隔符的区域设置,读取数据,将区域设置更改为点为分隔符的位置,然后写出。但就像我说的,我从来没试过,所以我不知道这是否有效。在

Excel的TextToColumns允许您指定千位分隔符和十进制字符。我不能从你的问题中看出你到底想要怎样的结果。它可能很简单,只需在Excel中打开(或导入)ASCII文件(无论以哪种方式打开texttocolumns向导),并指定您的需求。在

另外,在不知道源数据是什么样子的情况下编写输入例程有点困难。您只显示了它在Excel中的外观,而不是原始文件。在

这是一个VBA宏,它允许您选择一个文件(过滤文件,使您只看到.ascii文件类型的文件;然后逐行读取文件,去掉前导的“>;”(如果不需要,可以省略)。然后,在指定了千位分隔符和十进制分隔符之后,它按空格字符拆分文件。在VBA例程中,可以指定数据的目标,我就是这样做的。在

Option Explicit
'Could use late-binding for easier portability
'    Early binding  > Intellisense help
'Set reference to Microsoft Scripting Runtime
Sub GetASCIIFile()
    Dim FSO As FileSystemObject
    Dim TS As TextStream
    Dim sFilePath As String
    Dim rData As Range
    Dim S As String

'set rData to first cell for output
Set rData = Range("A1")

'Get File Path
sFilePath = Application.GetOpenFilename("ASCII Files (*.ascii), *.ascii")

Set FSO = New FileSystemObject
Set TS = FSO.OpenTextFile(sFilePath, ForReading)

Do Until TS.AtEndOfStream = True
    S = TS.ReadLine

    'Remove leading > if present
    If Left(S, 1) = ">" Then S = Mid(S, 2)

    'Write into cell
    rData = S
    Set rData = rData(2, 1)
Loop

'Split the data on <space>

With Range("a2", Cells(Rows.Count, "a").End(xlUp))
    .TextToColumns Destination:=[b2], DataType:=xlDelimited, consecutivedelimiter:=True, _
    Tab:=False, semicolon:=False, comma:=False, Space:=True, other:=False, _
    DecimalSeparator:=",", ThousandsSeparator:="."

End With

End Sub

相关问题 更多 >