我有一些.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是理想的选择。
这就是我所拥有的 - 我是
app = QApplication( sys.argv )
fname1 = unicode( QFileDialog.getOpenFileName() )
app.quit
csv1_array = []
with open(fname1,'rb') as csv1_doc:
csv1_array += csv.reader(csv1_doc)
path_plus_title1 = (fname1.strip('.ascii')) +'.csv'
with open(path_plus_title1, 'wb') as outfile:
writer = csv.writer(outfile)
writer.writerows(csv1_array)
我知道,我应该将这些位置于函数中,我会的。我只是想快点做脏。
以下是我的输出目前的样子:
>"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选项。
答案 0 :(得分:1)
该unicode仅用于文件名。它对文件的内容没有任何作用。
您正在以二进制文件的形式阅读和编写文件。从问题中不清楚这是否是你真正想要的。
这条线上有一个有点偷偷摸摸的错误:
path_plus_title1 = (fname1.strip('.ascii')) +'.csv'
strip()
并不能按照您的想法行事。它会删除要求删除的字符串末尾的所有字符。因此,如果fname1
是'isac.ascii'
,那么strip()
将生成空字符串!
最后,这是我猜的地方,因为你的问题不清楚,你会想要转换" 0,671164096921757"进入" 0.671164096921757"。换句话说,您的数据是在使用逗号作为小数分隔符的区域设置中生成的,但您希望将其转换为使用点作为小数分隔符的区域设置。
您可能希望在阅读代码中添加的第一个更改是指定分隔符。默认情况下,它是逗号,它将您的数据分成不同的单元格。
有一种可靠的转换逗号的方法,以及另一种我尚未测试的潜在方式。可靠的方法是在读取和写入数据之间添加代码,检查内存中的数据,识别数字+逗号+数字的模式并自行转换。
另一种可能的方法是将您的语言环境更改为逗号为小数点分隔符,读取数据,将区域设置更改为dot为分隔符的位置,然后写出。但就像我说的那样,我从来没有尝试过,所以我不知道这是否有用。
答案 1 :(得分:0)
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